【问题标题】:Trouble with the IN keyword in transact sql [duplicate]Transact sql中的IN关键字有问题[重复]
【发布时间】:2013-04-28 22:05:30
【问题描述】:

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

【问题讨论】:

  • SQL Server 不会检查变量的内容以查看它是否包含逗号分隔的列表。你正在有效地做WHERE PARAM1 = '11416407,11416410'...
  • 你需要查看table-valued parameters

标签: sql sql-server-2008 tsql


【解决方案1】:

您不能将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
)

【讨论】:

    【解决方案2】:

    您的 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;
    

    【讨论】:

      猜你喜欢
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多