如何在 SQL 服务器存储过程中创建动态参数
How to create dynamic parameters in SQL Server stored procedure
我有一个动态生成输入的表单,然后我获取它们的值并动态生成命令参数。
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 服务器存储过程,存储过程应该如何传递?
首先,这不是正确的设计。
为了实现您的目标,您需要在 SQL 语句中传递多个值,如下所示
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)]);
}
}
您可以为 table 中的每个字段提供默认值,因此您未传入的任何参数都将获得默认值。这里我演示了 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
如果你想 "insert each parameter into separate row" 那么也许最好使用 table 变量作为存储过程参数?
您的用户定义 Table 类型和存储过程可能如下所示:
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 示例,了解如何初始化 table 参数并将其传递给存储过程
我有一个动态生成输入的表单,然后我获取它们的值并动态生成命令参数。
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 服务器存储过程,存储过程应该如何传递?
首先,这不是正确的设计。
为了实现您的目标,您需要在 SQL 语句中传递多个值,如下所示
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)]);
}
}
您可以为 table 中的每个字段提供默认值,因此您未传入的任何参数都将获得默认值。这里我演示了 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
如果你想 "insert each parameter into separate row" 那么也许最好使用 table 变量作为存储过程参数?
您的用户定义 Table 类型和存储过程可能如下所示:
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 示例,了解如何初始化 table 参数并将其传递给存储过程