如何在SQL Server中检查一个表变量是否为空?

17

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

@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中有多个项目,我会收到以下错误提示:

子查询返回了多个值。当子查询跟随=、!=、<、<=、>、>=时,或者当子查询用作表达式时,不允许这样做。

这是可以理解的,所以我将其更改为:

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

功能完美,我所关注的是性能问题。

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

AND (
    ( @dataInTable IS EMPTY )
    OR
    ( item IN ( SELECT T FROM @dataInTable ) )
)
3个回答

35

表变量与标量变量不同,因此像您提到的@dataInTable IS NULL是不允许的。我建议采用以下方式:

EXISTS (SELECT 1 FROM @dataInTable)

如果你真的关心计数,以下内容也可能适用于你的情况:

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

11

总是有exists

例如:

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

4
EXISTSCOUNT更有效率,因为它在找到第一行后就停止执行了。 - Martin Smith
1
@EricYin 如果你想在 SELECT 中使用它,那么你可能正在寻找 CASE。根据你目前发布的片段,很难知道你在做什么。 - Martin Smith
1
@EricYin,我不明白为什么你不能使用exists来替换你在问题中所发布的内容:如果@dataInTable为空,则将@dataInTable IS EMPTY替换为exists (select 1 from @dataInTable)。如果不是这种情况,你应该在问题中添加更多的上下文... - Factor Mystic
1
@EricYin,你有看到它是以“exists”结尾的吗?你已经说了两次“exist”,这是不正确的。 - Factor Mystic
1
@EricYin - 对我来说没有显示成蓝色。你确定没有敲“EXIT”吗?也许你的键盘上的 S 键有点磨损了! - Martin Smith
显示剩余2条评论

7
要检查表变量是否为空,只需像其他人已经提到的那样使用EXISTS,但是如果您将空集与未知集区分开来,则没有选择-您必须引入额外的变量,以确定空集是否确实为空或未知。
declare @dataInTableIsUnknown BIT

...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接