通过存储过程传递“in”列表

时间:2009-03-06 04:51:39

标签: sql-server tsql stored-procedures

如何构建一个允许我传递(例如)@IDList的存储过程,以便我可以写:

Select * from Foo Where ID in @IDList

这可行吗?

3 个答案:

答案 0 :(得分:12)

使用SQL2005及更高版本,您可以直接从代码发送数组。

首先创建一个自定义类型

CREATE TYPE Array AS table (Item varchar(MAX))

比存储过程。

CREATE PROCEDURE sp_TakeArray
    @array AS Array READONLY
AS BEGIN
    Select * from Foo Where ID in (SELECT Item FROM @array)
END

然后从传入DataTable的代码中调用数组

DataTable items = new DataTable();
items.Columns.Add( "Item", typeof( string ) );

DataRow row = items.NewRow();
row.SetField<string>( "Item", <item to add> );
items.Rows.Add( row );

SqlCommand command = new SqlCommand( "sp_TakeArray", connection );
command.CommandType = CommandType.StoredProcedure;
SqlParameter param = command.Parameters.Add( "@Array", SqlDbType.Structured );
param.Value = items;
param.TypeName = "dbo.Array";

SqlDataReader reader = command.ExecuteReader();

答案 1 :(得分:4)

答案 2 :(得分:0)

将个人ID写入表B,所有ID都具有相同的“密钥”(也许是GUID) 然后,您对表A的查询将包括

where ID in (select ID from B where key = @TempKey)

(如果你已经完成了它们,你可能会删除它们。或者,给它们加上时间戳并让你的SQL作业稍后再做。)

<强>优点:

  • 您不发送字符串,在某些情况下可能会使您暴露于SQL注入。
  • 根据您的其他应用程序逻辑,您不必一次跟踪或写入所有可能性。

<强>缺点:

  • 效率极低,特别是在重负荷下。