如何检查SQL Server中的表变量是否为空?

时间:2012-01-05 18:17:26

标签: sql-server tsql null table-variable

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

@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 ) )
)

3 个答案:

答案 0 :(得分:25)

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

EXISTS (SELECT 1 FROM @dataInTable)

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

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

答案 1 :(得分:11)

总是exists

例如:

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

答案 2 :(得分:6)

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

,但

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

declare @dataInTableIsUnknown BIT

...

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