2012-01-05 126 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

相關問題