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

Eri*_*Yin 12 t-sql sql-server null table-variable

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

@dataInTable dbo.Table_Variable readonly,
....

AND (
    ( @dataInTable IS NULL )
    OR
    ( item IN ( SELECT T FROM @dataInTable ) )
)
Run Code Online (Sandbox Code Playgroud)

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

必须声明标量变量"@dataInTable"

所以我把它改成:

(SELECT T FROM @dataInTable) IS NULL
Run Code Online (Sandbox Code Playgroud)

这有效,但如果@dataInTable有多个项目,我收到一个错误:

子查询返回的值超过1.当子查询跟随=,!=,<,<=,>,> =或子查询用作表达式时,不允许这样做.

可以理解,所以我把它改成:

(SELECT TOP(1) T FROM @ProgramRatings) IS NULL
Run Code Online (Sandbox Code Playgroud)

完美的工作,我所拥有的是性能问题.

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

AND (
    ( @dataInTable IS EMPTY )
    OR
    ( item IN ( SELECT T FROM @dataInTable ) )
)
Run Code Online (Sandbox Code Playgroud)

Phi*_*ein 27

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

EXISTS (SELECT 1 FROM @dataInTable)
Run Code Online (Sandbox Code Playgroud)

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

DECLARE @dataCount int = (SELECT COUNT(1) FROM @dataInTable)
IF @dataCount = 0 -- Empty
Run Code Online (Sandbox Code Playgroud)


Fac*_*tic 11

永远都有exists.

例如:

select 'Yep'
where exists (select 1 from @dataInTable)
Run Code Online (Sandbox Code Playgroud)

  • +1`EXISTS`可以比`COUNT`更有效,因为它在第一行之后停止. (4认同)

Ole*_*Dok 6

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

如果你将空集与未知集相区别 - 那么你别无选择 - 你必须引入额外的变量,指出空集是真空还是未知.

declare @dataInTableIsUnknown BIT

...

AND (
    ( @dataInTableIsUnknown = 1 )
    OR
    ( item IN ( SELECT T FROM @dataInTable ) )
)
Run Code Online (Sandbox Code Playgroud)