2015-02-07 160 views
0

我有一个动态生成输入的表单,然后获取它们的值并动态生成命令参数。如何在SQL Server存储过程中创建动态参数

SqlConnection con = new SqlConnection(cs); 

    SqlCommand cmd =new SqlCommand("insert_op",con); 
    cmd.CommandType = CommandType.StoredProcedure; 

    for (int i = 0; i < Request.Form.Count; i++) 
    { 
     if (Request.Form["frm_option" + (i + 1)] != null) 
     { 

      cmd.Parameters.AddWithValue("@op" + i, Request.Form["frm_option" + (i + 1)]); 
     } 
    } 
    try 
    { 
     using (con) 
     { 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
    catch 
    { 
    } 

如何将这些动态参数传递给SQL Server存储过程以及存储过程应该如何进行?

回答

1

如果你想“插入每个参数到单独的行”,那么也许最好是使用表变量作为存储的prosedure参数?

您的用户定义表类型和存储过程可能是这样的:

create type dbo.ValueTableType as table (Value varchar(255)) 
GO 

create procedure dbo.InsertValues 
    @Values dbo.ValueTableType readonly 
as 
begin 

    insert into dbo.YourTable (Value) 
    select Value from @Values; 
end 

查看如何初始化这个ADO.NET例子和表格参数传递到存储过程https://stackoverflow.com/a/10409710/623190

2

首先,这不是正确的设计。

要实现你的目标,你需要在SQL statment传递多个值如下

SQL

INSERT INTO tbl_options(op_name) VALUES (value1),(value2),...(nthValue) 

代码

您的代码将是这样的

string command = "INSERT INTO tbl_options(op_name) VALUES";  
for (int i = 0; i < Request.Form.Count; i++) 
       {      
        if (Request.Form["frm_option" + (i + 1)] != null) 
        { 
         command += "(@op" + i + "),"; 

         cmd.Parameters.AddWithValue("@op" + i, Request.Form["frm_option" + (i + 1)]); 
        } 
       } 
+0

我编辑我的问题! – Mike 2015-02-07 13:03:54

+0

存储过程应该如何? – Mike 2015-02-07 13:07:28

+1

我建议将一个参数传递给SP,它应该是csv列表。 (我假设所有的值都是单列表)。 – 2015-02-07 13:16:23

1

您可以为表格中的每个字段提供默认值,因此您没有通过的任何参数都将获得默认值。这里我演示了NULL的默认值。

CREATE PROCEDURE [dbo].[sproc_tbl_options_Insert] 
    @op_name nvarchar(50) = NULL, 
    @op_somethingelse nvarchar(5) = NULL, 
    @op_number int = NULL 
AS 
BEGIN 
    INSERT INTO [tbl_options] (op_name, op_somethingelse, op_number) 
    VALUES (@op_name, @op_somethingelse, @op_number); 
END