Можно ли использовать параметры запроса для заполнения ключевого слова IN

Представьте себе таблицу с GUID в качестве первичного ключа. Я хотел бы выбрать несколько из этих строк на основе их первичного ключа. Я хотел бы использовать запрос типа:

SELECT * FROM mytable WHERE id IN ('firstguidhere','secondguidhere');

Я использую ADO.NET для запросов к базе данных, поэтому я хотел бы использовать параметризованный запрос вместо динамического sql, который, очевидно, будет работать, но я хочу сохранить преимущества параметризованных запросов (безопасность, экранирование и т. д...) .

Можно ли залить сбор для IN-клауз с помощью sql-параметров?


person lowglider    schedule 26.02.2009    source источник
comment
Где-то здесь есть повторяющийся вопрос... найти его...   -  person Jon Skeet    schedule 26.02.2009
comment
stackoverflow.com/questions/337704/   -  person Jon Skeet    schedule 26.02.2009
comment
@Jon, принятый ответ на этот вопрос на самом деле не оптимален, хотя это хак, который я сам использовал много раз, и он подойдет для небольших таблиц и / или нечастых запросов.   -  person LukeH    schedule 26.02.2009
comment
@jon, спасибо, что указали на другой вопрос. Я искал, но не нашел этот вопрос. Я рассматриваю возможность использования второго ответа, когда вы динамически генерируете параметризованный запрос. Считаю этот вопрос закрытым. Кто-нибудь может это сделать?   -  person lowglider    schedule 26.02.2009


Ответы (1)


Вы можете передать список идентификаторов GUID в виде строкового параметра, разделенного запятыми, и использовать UDF с табличным значением, чтобы разделить их на таблицу для использования в предложении IN:

SELECT *
FROM my_table
WHERE id IN (SELECT id FROM dbo.SplitCSVToTable(@MyCSVParam))

У Эрланда Соммарскога есть интересная статья с примерами разделения строки в таблицы с помощью UDF.

(Из соображений производительности вы должны убедиться, что ваша пользовательская функция является встроенной с табличным значением, а не с несколькими операторами.)

person LukeH    schedule 26.02.2009
comment
Недавно использовал статью Sommarskog для решения аналогичной проблемы. Отлично работал для наших нужд. - person schooner; 26.02.2009