Передача списка через хранимую процедуру

Как я могу создать хранимую процедуру, которая позволит мне передать (например) @IDList, чтобы я мог написать:

Select * from Foo Where ID in @IDList

Это выполнимо?


person klkitchens    schedule 06.03.2009    source источник
comment
Какую базу данных вы используете? С какого языка вы передаете список?   -  person bstoney    schedule 06.03.2009


Ответы (3)


см. этот ответ ...

Хранимая процедура T-SQL, которая принимает несколько значений идентификаторов

person dotjoe    schedule 06.03.2009

С 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();
person bstoney    schedule 06.03.2009
comment
Это применимо только к Sql server 2008. - person Ashish Gupta; 08.08.2012

Запишите отдельные идентификаторы в таблицу B, все с одним и тем же «ключом» (возможно, GUID).
Затем ваш запрос к таблице A будет включать

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

(Затем вы можете удалить ключи, если закончите с ними. Или отметьте их временем, и задание sql сделает это позже.)

Плюсы:

  • Вы не отправляете строку, которая в некоторых случаях может подвергнуть вас SQL-инъекции.
  • В зависимости от логики вашего другого приложения вам не нужно отслеживать или записывать все возможности сразу.

Минусы:

  • Это могло быть крайне неэффективно, особенно при больших нагрузках.
person Doug L.    schedule 06.03.2009