【发布时间】:2010-10-11 16:31:48
【问题描述】:
如何构造一个存储过程,让我可以传递(例如)@IDList 以便我可以编写:
Select * from Foo Where ID in @IDList
这可行吗?
【问题讨论】:
-
您使用的是哪个数据库?您从哪种语言传递列表?
标签: sql-server tsql stored-procedures
如何构造一个存储过程,让我可以传递(例如)@IDList 以便我可以编写:
Select * from Foo Where ID in @IDList
这可行吗?
【问题讨论】:
标签: sql-server tsql stored-procedures
使用 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();
【讨论】:
【讨论】:
将各个 ID 写入表 B,全部使用相同的“键”(可能是 GUID)。
然后,您对表 A 的查询将包括
where ID in (select ID from B where key = @TempKey)
(如果你完成了它们,你可能会删除它们。或者,给它们加上时间戳,然后让一个 sql 作业来做。)
优点:
缺点:
【讨论】: