Проблема с ключевым словом IN в транзакции SQL
Я создаю сценарий, где я запрашиваю таблицу, используя ключевое слово IN. Когда я печатаю данные внутри предложения IN, запрос выполняется так, как я должен. Но когда я создаю переменную с точно такими же данными и использую переменную внутри предложения IN, это не так. Есть идеи???
Вот запрос, который работает
SELECT *
FROM scpcommandeventlog
WHERE MESSAGEid = 3
AND PARAM1 IN('11416407','11416410','11416413','11416417',
'11416419','11416421','11416423','11416427',
'11416432','11416433','11416434','11416435',
'11416438','11416443','11416446','11416448',
'11416451','11416454','11416458','11416462')
вот запрос, который не
SELECT * FROM scpcommandeventlog WHERE MESSAGEid = 3 AND PARAM1 IN(@list)
Вот запрос, который заполняет переменную @list
DECLARE @List varchar(max)
SELECT @List = isnull(@List + ',', '') + '''' + cast(itemid as varchar) + ''''
FROM dbo.ItemList
WHERE sortid LIKE @sortid
2 ответа
Вы не можете поставить все параметры для IN
запрос в одной переменной, вам нужен параметр для каждого значения, как в;
SELECT *
FROM scpcommandeventlog
WHERE MESSAGEid = 3 AND PARAM1 IN(@p1,@p2,@p3,...)
Вы можете построить запрос с использованием динамического SQL, но лучшим примером в вашем примере может быть не создание списка вообще, а выполнение всего этого за один запрос;
SELECT *
FROM scpcommandeventlog
WHERE MESSAGEid = 3 AND PARAM1 IN (
SELECT itemid
FROM dbo.ItemList
WHERE sortid LIKE @sortid
)
Ваша переменная IN @list интерполируется как атомарное значение, а не как список, и поэтому вы не получите результатов.
Если ItemList уникален с данными параметрами, вы можете заменить логику IN простым JOIN:
SELECT g.*
FROM scpcommandeventlog g
JOIN dbo.ItemList i ON i.itemid = g.PARAM1 AND i.sortid LIKE @sortid
WHERE g.MESSAGEid = 3;