【问题标题】:How to check if a table variable is empty in SQL Server?如何检查 SQL Server 中的表变量是否为空?
【发布时间】:2012-02-03 13:53:18
【问题描述】:

这是我的一个存储过程的一部分:

@dataInTable dbo.Table_Variable readonly,
....

AND (
    ( @dataInTable IS NULL )
    OR
    ( item IN ( SELECT T FROM @dataInTable ) )
)

@dataInTable IS NULL 语法错误,错误是

必须声明标量变量“@dataInTable”

所以我把它改成:

(SELECT T FROM @dataInTable) IS NULL

这可行,但如果 @dataInTable 有超过 1 个项目,我会收到错误:

子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。

可以理解,所以我改成:

(SELECT TOP(1) T FROM @ProgramRatings) IS NULL

完美运行,我所关心的是性能问题。

我想知道,是否有更简单的方法来检查表变量是否为空,例如

AND (
    ( @dataInTable IS EMPTY )
    OR
    ( item IN ( SELECT T FROM @dataInTable ) )
)

【问题讨论】:

    标签: sql-server tsql null table-variable


    【解决方案1】:

    表变量与标量变量不同,因此您提到的 @dataInTable IS NULL 是不允许的。我建议如下:

    EXISTS (SELECT 1 FROM @dataInTable)
    

    如果您真的想知道计数,以下内容也可能对您的情况有意义:

    DECLARE @dataCount int = (SELECT COUNT(1) FROM @dataInTable)
    IF @dataCount = 0 -- Empty
    

    【讨论】:

      【解决方案2】:

      总是有exists

      例如:

      select 'Yep'
      where exists (select 1 from @dataInTable)
      

      【讨论】:

      • +1 EXISTS 可能比COUNT 更有效,因为它在第一行之后停止。
      • @EricYin 如果您想在SELECT 中使用它,您可能正在寻找CASE。根据您迄今为止发布的片段很难知道您在做什么。
      • @EricYin 我不明白为什么您不能使用 exists 代替您目前在问题中发布的内容:@dataInTable IS EMPTY 替换为 exists (select 1 from @dataInTable) 如果这样不是这种情况,您应该为您的问题添加更多上下文...
      • @EricYin 你确实看到了existss 结尾,对吧?你现在已经说了两次“存在”,那是不正确的。
      • @EricYin - 对我来说不显示为蓝色。确定你没有输入EXIT?也许你的S 密钥已经用完了!
      【解决方案3】:

      为了检查表变量是否为空,只需使用其他人已经提到的EXISTS,

      但是

      如果你将空集与未知集区分开来——那么你别无选择——你必须引入额外的变量来说明空集是真的空集还是未知集。

      declare @dataInTableIsUnknown BIT
      
      ...
      
      AND (
          ( @dataInTableIsUnknown = 1 )
          OR
          ( item IN ( SELECT T FROM @dataInTable ) )
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2011-05-20
        • 2012-02-05
        相关资源
        最近更新 更多