这是我的一个存储过程的一部分:
@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 ) )
)
答案 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 ) )
)