从客户端传递给存储过程的参数数量未知。如何处理?

时间:2016-01-15 09:27:51

标签: sql sql-server stored-procedures

我想创建一个存储过程,将Archive表中的一些记录插入主表。

我的问题是客户端在他的网格中有多个复选框,他/她可以检查任意数量的复选框。每个复选框代表Archive表中的记录。每条记录由orderNo标识。在orderNo的基础上,我想创建一个存储过程,该过程从Archive表中获取记录并将其插入主表。

我的问题:如何在此存储过程中有效地处理未知数量的参数?在伪代码中:

create procedure moveRecords(what parameters i should take here)
as 
begin
insert into mainTable(orderNo,date,siteID) select orderNo,date,siteID from 
ArchiveTable where orderNo=<here what i write>

客户端可以发送1个参数,2个,3个,10个,20个参数等我们不知道。如下所示:

exec moveRecords(any no. of parameters)

我提出了类似以下的解决方案:

  1. 将所有orderNo(由客户端发送)放入一个temp_Table并从我的存储过程中的temp_Table中检索这些内容。
  2. 在服务器端,我们在数组中调用所有orderNo,并根据此数组调用过程。
  3. 我正在寻找其他选择。

3 个答案:

答案 0 :(得分:5)

如果使用MSSQL 2008或更高版本,则可以使用TVP(表值参数)。这是描述它们的article。以下是关于在C#中使用TVP的question

TVP很容易使用:

  1. 首先,您必须使用CREATE TYPE dbo.NameOfYourType ...命令定义一种TVP。
  2. 然后您必须修改存储过程。例如:create procedure moveRecords(@Input dbo.NameOfYourType READONLY) ...
  3. 然后从C#调用此存储过程作为任何其他存储过程。 TVP参数在C#中由DataTable表示。

答案 1 :(得分:0)

您可以传递xml并按照here所述在过程中解析它。这个sa,也描述了表值参数。

答案 2 :(得分:0)

create procedure Usp_Testproc
(
@iordernumber int
)
as 
begin
insert into mainTable(orderNo,date,siteID) 
select orderNo,date,siteID from ArchiveTable where orderNo=@iordernumber