1.编写存储过程
建表存储过程编写:由于不能给存储过程传入数据集参数,所以如果要动态创建数据,必须把要创建的数据表结构单条传入,因此C#调用存储过程时
会通过循环给存储过程传参(相当于每一条记录都执行一次存储过程),所以利用循环次数和要传入的总记录条数来控制建表sql
语句的拼接,同时还需要对要创建的数据列的数据类型进行判断,然后使用不同的拼接方式
--存储过程
USE WW
GO
--判断数据库中是否已存在该存储过程,存在则删除(需要单独执行)
if exists
(SELECT * FROM sysobjects WHERE NAME='CREATE_TABLE_P' AND TYPE='P')
DROP PROCEDURE CREATE_TABLE_P
--==================创建存储过程==================
CREATE PROCEDURE CREATE_TABLE_P
@TABLE_NAME VARCHAR(15), --输入参数,要创建的表名
@COLUMN_NAME VARCHAR(20), --输入参数,列名
@COLUMN_DATA_TYPE VARCHAR(20), --输入参数,列的数据类型
@COLUMN_LENGTH VARCHAR(20), --输入参数,列的长度
@COLUMN_IFNULL VARCHAR(20), --输入参数,是否为空
@COUNT INT, --输入参数,当前列
@COUNT_TOTAL INT, --输入参数,总列数
@CREATE_TABLE_SQL_TEMP VARCHAR(MAX) OUT, --输出参数
@RETURN_MESSAGE VARCHAR(MAX)
AS
DECLARE @CREATE_TABLE_SQL NVARCHAR(MAX) --声明一个变量用于存储建表sql语句
DECLARE @DROP_TABLE_SQL NVARCHAR(MAX) --声明一个变量用于存储删表sql语句
--判断@COLUMN_IFNULL的值,如果为Y代表字段允许为空,为N则不能为空
IF(@COLUMN_IFNULL='Y')
BEGIN
SET @COLUMN_IFNULL='null'
END
ELSE
BEGIN
SET @COLUMN_IFNULL='is not null'
END
IF(@COUNT=1)--判断当前列是否为第一列
BEGIN
SET @CREATE_TABLE_SQL='CREATE TABLE '
+@TABLE_NAME+'('
--列名
+@COLUMN_NAME+' '
--列数据类型
+@COLUMN_DATA_TYPE
--列数据类型
+'('+@COLUMN_LENGTH+') '
--列是否允许空
+@COLUMN_IFNULL
+','
SET @CREATE_TABLE_SQL_TEMP=@CREATE_TABLE_SQL
END
ELSE
BEGIN
IF(@COUNT<>@COUNT_TOTAL)--判断当前列是否为最后一列
BEGIN
SET @CREATE_TABLE_SQL=@RETURN_MESSAGE
--列名
+@COLUMN_NAME+' '
--列数据类型
+@COLUMN_DATA_TYPE
--列数据类型
+'('+@COLUMN_LENGTH+') '
--列是否允许空
+@COLUMN_IFNULL
+','
SET @CREATE_TABLE_SQL_TEMP=@CREATE_TABLE_SQL
END
ELSE
BEGIN
SET @CREATE_TABLE_SQL=@RETURN_MESSAGE
--列名
+@COLUMN_NAME+' '
--列数据类型
+@COLUMN_DATA_TYPE
--列数据类型
+'('+@COLUMN_LENGTH+') '
--列是否允许空
+@COLUMN_IFNULL
+')'
SET @CREATE_TABLE_SQL_TEMP=@CREATE_TABLE_SQL
if exists
(SELECT * FROM sysobjects WHERE NAME=@TABLE_NAME AND TYPE='U')--判断表是否存在
BEGIN
SET @DROP_TABLE_SQL='DROP TABLE '+ @TABLE_NAME
EXEC(@DROP_TABLE_SQL)
EXEC(@CREATE_TABLE_SQL_TEMP)
END
ELSE
BEGIN
EXEC(@CREATE_TABLE_SQL_TEMP)
--RETURN (select @RETURN_MESSAGE as 建表Sql)
END
END
END
2.C#调用存储过程
<span style="white-space:pre"> </span>SqlCommand comm1 = new SqlCommand("CREATE_TABLE_P", Tools.DBConnection.conn);
//设置命令的类型为存储过程
comm1.CommandType = CommandType.StoredProcedure;
//设置参数(输入参数只需要设置类型,输出参数则还需要设置长度,否则默认为0)
comm1.Parameters.Add("@TABLE_NAME", SqlDbType.VarChar);
comm1.Parameters.Add("@COLUMN_NAME", SqlDbType.VarChar);
comm1.Parameters.Add("@COLUMN_DATA_TYPE", SqlDbType.VarChar);
comm1.Parameters.Add("@COLUMN_LENGTH", SqlDbType.VarChar);
comm1.Parameters.Add("@COLUMN_IFNULL", SqlDbType.VarChar);
comm1.Parameters.Add("@COUNT", SqlDbType.Int);
comm1.Parameters.Add("@COUNT_TOTAL", SqlDbType.Int);
comm1.Parameters.Add("@CREATE_TABLE_SQL_TEMP", SqlDbType.VarChar, Int32.MaxValue);
comm1.Parameters.Add("@RETURN_MESSAGE", SqlDbType.VarChar,Int32.MaxValue);
//设置参数类型(输入还是输出,默认都为输入,所以只需要设置输出类型)
comm1.Parameters["@CREATE_TABLE_SQL_TEMP"].Direction = ParameterDirection.Output;
//为参数(输入参数)赋值
comm1.Parameters["@TABLE_NAME"].Value = dr["TABLE_NAME"].ToString();//表名
comm1.Parameters["@COLUMN_NAME"].Value = dr["COLUMN_CODE"].ToString();//列名
comm1.Parameters["@COLUMN_DATA_TYPE"].Value = dr["COLUMN_DATA_TYPE"].ToString();//列数据类型
comm1.Parameters["@COLUMN_LENGTH"].Value = dr["COLUMN_LENGTH"].ToString();//列长度
string aaa = dr["COLUMN_IFNULL"].ToString();
comm1.Parameters["@COLUMN_IFNULL"].Value = dr["COLUMN_IFNULL"].ToString();//是否为空
comm1.Parameters["@COUNT"].Value = COUNT;//当前列数
comm1.Parameters["@COUNT_TOTAL"].Value = COUNT_TOTAL;//总列数
comm1.Parameters["@RETURN_MESSAGE"].Value = sql_temp;//将存储过程拼接的建表sql又传入到存储过程
COUNT++;
int count = comm1.ExecuteNonQuery();
sql_temp = comm1.Parameters["@CREATE_TABLE_SQL_TEMP"].Value.ToString();//获取存储过程返回的建表的sql语句