在transact sql中遇到IN关键字问题

时间:2013-05-04 17:15:22

标签: sql sql-server-2008 tsql

我正在创建一个脚本,我使用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 个答案:

答案 0 :(得分: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 :(得分:1)

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

如果ItemList对于给定的参数是唯一的,则可以用简单的JOIN替换IN逻辑:

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