2013-05-04 51 views
1

我正在创建一个脚本,我正在使用IN关键字查询一个表。 当我在IN子句中键入数据时,查询会按我应该的方式执行。但是当我使用完全相同的数据创建一个变量并在IN子句中使用变量时,它不会。有任何想法吗???交易sql中的关键字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 
+1

SQL Server将不检查变量的内容,看它是否包含一个逗号分隔的列表。您正在有效地做'WHERE PARAM1 ='11416407,11416410'...' – 2013-05-04 17:27:02

+2

您需要查看[表值参数](http://msdn.microsoft.com/zh-cn/library/bb510489(v = SQL.100)的.aspx)。 – 2013-05-04 18:20:44

回答

5

您查询无法将一个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 
) 
1

您的IN @list变量被插值为原子值而不是列表,因此不会得到任何结果。

如果ITEMLIST是给定参数的唯一,你可以用更换逻辑简单的JOIN:

SELECT g.* 
FROM scpcommandeventlog g 
JOIN dbo.ItemList i ON i.itemid = g.PARAM1 AND i.sortid LIKE @sortid 
WHERE g.MESSAGEid = 3;