Проблема с ключевым словом 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;
Другие вопросы по тегам