1

我正在创建一个脚本,我在其中使用 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
4

2 回答 2

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
)
于 2013-05-04T17:27:34.950 回答
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;
于 2013-05-04T17:37:58.530 回答