2015-02-07 205 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