2012-01-05 127 views
8

这是我的存储过程中的一个部分:如何检查SQL Server中的表变量是否为空?

@dataInTable dbo.Table_Variable readonly, 
.... 

AND (
    (@dataInTable IS NULL) 
    OR 
    (item IN (SELECT T FROM @dataInTable)) 
) 

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

Must declare the scalar variable "@dataInTable"

所以我将其更改为:

(SELECT T FROM @dataInTable) IS NULL 

该作品但是如果@dataInTable有多个项目,我收到一个错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

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

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

完美的作品,我有什么是性能问题。

我想知道,如果有一个更简单的方法来检查表变量是否是空的,就像

AND (
    (@dataInTable IS EMPTY) 
    OR 
    (item IN (SELECT T FROM @dataInTable)) 
) 

回答

5

对于检查表变量是空的,只是用作为已经被其他人提到EXISTS,

如果不同于未知空集设置 - 那么你没有选择 - 你必须引入额外的变量,如果空集是空的或未知的状态。

declare @dataInTableIsUnknown BIT 

... 

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

表变量与标量变量,这样@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

+1''EXISTS'可以比'COUNT'更有效率,因为它在第一行之后停止。 – 2012-01-05 18:31:13

+0

谢谢,我试过存在,但它不能在选择条件内使用:AND( (我不能把这里存在) OR (项(选择T FROM @dataInTable)) )。你知道正确的语法 – 2012-01-05 18:44:37

+1

@EricYin如果你想在'SELECT'中使用它,你可能正在寻找'CASE'。根据目前发布的片段很难知道自己在做什么。 – 2012-01-05 18:50:52

相关问题