【问题标题】:Passing an "in" list via stored procedure [duplicate]通过存储过程传递“in”列表[重复]
【发布时间】:2010-10-11 16:31:48
【问题描述】:

如何构造一个存储过程,让我可以传递(例如)@IDList 以便我可以编写:

Select * from Foo Where ID in @IDList

这可行吗?

【问题讨论】:

  • 您使用的是哪个数据库?您从哪种语言传递列表?

标签: sql-server tsql stored-procedures


【解决方案1】:

使用 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();

【讨论】:

  • 这个只适用于Sql server 2008。
【解决方案2】:

【讨论】:

    【解决方案3】:

    将各个 ID 写入表 B,全部使用相同的“键”(可能是 GUID)。
    然后,您对表 A 的查询将包括

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

    (如果你完成了它们,你可能会删除它们。或者,给它们加上时间戳,然后让一个 sql 作业来做。)

    优点:

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

    缺点:

    • 它可能效率极低,尤其是在重负载下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多