【问题标题】:Using variable with SQL WHERE IN statement在 SQL WHERE IN 语句中使用变量
【发布时间】:2021-03-31 19:00:52
【问题描述】:

我想在脚本顶部设置节点列表,然后检查它们是否在表中。 以下代码不会抛出错误,但逻辑不起作用。当列表中的节点之一存在时,它不会打印消息。

DECLARE @nodeId nvarchar(50)
SET @nodeId = 'SomeNodeID, SomeOtherNodeID'
IF EXISTS (SELECT NodeId FROM dbo.tblNodeMaster WHERE NodeId in (@nodeId))
BEGIN
    PRINT RTRIM(CONVERT(varchar(30), GETDATE())) + '  node exists.'
    RETURN
END

使用以下不带变量的代码可以正常工作。当列表中的任何节点存在时,它将打印消息。

IF EXISTS (SELECT NodeId FROM dbo.tblNodeMaster WHERE NodeId in ('SomeNodeID', 'SomeOtherNodeID'))
BEGIN
    PRINT RTRIM(CONVERT(varchar(30), GETDATE())) + '  node exists.'
    RETURN
END

【问题讨论】:

  • 您不能以这种方式对字符串使用in - 这是一个set 操作,它不会解析字符串。
  • 您使用的是 MS SQL Server 吗? (上面的代码是非常具体的产品。)
  • 是的 MS SQL Server

标签: sql-server tsql variables where-clause


【解决方案1】:

您可以使用table variable,而不是使用字符串

    Declare @NodeId table (NodeId varchar(30))
    insert into @NodeId
    select 'SomeNodeID' union all select 'SomeOtherNodeID'
    
    IF EXISTS (SELECT * FROM dbo.tblNodeMaster WHERE NodeId in (select NodeId from @nodeId))
...

【讨论】:

  • 所以,我实际上在数据文件中有 NodeID。所以我只是将它们加载到一个临时表中并使用它。感谢您的帮助!
  • 听说过values('SomeNodeID', 'SomeOtherNodeID')
  • 哈哈是的——我猜是习惯的力量。
【解决方案2】:
DECLARE @nodeId nvarchar(50) = 'SomeNodeID,SomeOtherNodeID'
IF EXISTS (SELECT * FROM dbo.tblNodeMaster WHERE NodeId IN (SELECT LTRIM(value) FROM STRING_SPLIT(@nodeId, ','))
BEGIN
    PRINT RTRIM(CONVERT(varchar(30), GETDATE())) + '  node exists.'
    RETURN
END

您可以使用 STRING_SPLIT 作为 IN 运算符的子查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 2016-05-15
    • 2012-02-19
    • 2014-02-16
    • 2021-12-23
    • 2012-12-24
    • 1970-01-01
    相关资源
    最近更新 更多