15

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

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

3 回答 3

34

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

EXISTS (SELECT 1 FROM @dataInTable)

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

DECLARE @dataCount int = (SELECT COUNT(1) FROM @dataInTable)
IF @dataCount = 0 -- Empty
于 2012-01-05T18:26:49.767 回答
11

总是有的exists

例如:

select 'Yep'
where exists (select 1 from @dataInTable)
于 2012-01-05T18:28:10.210 回答
7

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

如果您将空集与未知集不同 - 那么您别无选择 - 您必须引入额外的变量来说明空集是否真的为空或未知。

declare @dataInTableIsUnknown BIT

...

AND (
    ( @dataInTableIsUnknown = 1 )
    OR
    ( item IN ( SELECT T FROM @dataInTable ) )
)
于 2012-01-05T18:48:21.120 回答