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

1 sql t-sql sql-server-2008

我正在创建一个脚本,我使用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')
Run Code Online (Sandbox Code Playgroud)

这是没有的查询

SELECT * FROM scpcommandeventlog WHERE MESSAGEid = 3 AND PARAM1 IN(@list)
Run Code Online (Sandbox Code Playgroud)

以下是填充@list变量的查询

DECLARE @List varchar(max)

SELECT @List = isnull(@List + ',', '') + '''' + cast(itemid as varchar) + ''''
FROM dbo.ItemList
WHERE sortid LIKE @sortid
Run Code Online (Sandbox Code Playgroud)

Joa*_*son 5

您不能将IN查询的所有参数放在单个变量中,您需要每个值的参数,如;

SELECT * 
FROM scpcommandeventlog 
WHERE MESSAGEid = 3 AND PARAM1 IN(@p1,@p2,@p3,...)
Run Code Online (Sandbox Code Playgroud)

您可以使用动态SQL构建查询,但在您的示例中更好的方法可能是根本不构建列表并在单个查询中完成所有操作;

SELECT * 
FROM scpcommandeventlog 
WHERE MESSAGEid = 3 AND PARAM1 IN (
    SELECT itemid 
    FROM dbo.ItemList
    WHERE sortid LIKE @sortid
)
Run Code Online (Sandbox Code Playgroud)