2012-01-05 16 views
8

Jest to część jednej z moich procedury przechowywanej:Jak sprawdzić, czy zmienna tabeli jest pusta w SQL Server?

@dataInTable dbo.Table_Variable readonly, 
.... 

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

@dataInTable IS NULL jest złego w składni, błąd jest

Must declare the scalar variable "@dataInTable"

Więc go zmienić na:

(SELECT T FROM @dataInTable) IS NULL 

to działa ale jeśli @dataInTable ma więcej niż 1 pozycję, pojawia się błąd:

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

Zrozumiałe, więc go zmienić na:

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

działa doskonale, co mam obawy wydajność.

Zastanawiam się, czy nie ma łatwiejszego sposobu, aby sprawdzić, czy zmienna tabela jest pusta, jak

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

Odpowiedz

5

Dla sprawdzenia, czy zmienna tabela jest pusta, wystarczy użyć ISTNIEJE jak już wspomniano przez innych ludzi,

ale

jeśli różnią się zbiór pusty nieznany set - wtedy nie masz wyboru - musisz wprowadzić dodatkową zmienną, która stwierdza, że ​​pusty zestaw jest naprawdę pusty lub nieznany.

declare @dataInTableIsUnknown BIT 

... 

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

zmiennych tabeli są różne od zmiennych skalarnych tak @dataInTable IS NULL nie jest dozwolony, jak wspomniano. Proponuję następujące:

EXISTS (SELECT 1 FROM @dataInTable) 

Poniższa również może mieć sens dla sytuacji, jeśli rzeczywiście dbają, aby poznać ilość:

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

Zawsze exists.

Na przykład:

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

+1 "EXISTS" może być bardziej wydajny niż "COUNT", ponieważ zatrzymuje się po pierwszym rzędzie. –

+0

Dzięki, próbowałem istnieć, ale nie można go używać w warunkach wyboru: AND ( (NIE MOGĘ MIEJSCE istnieć TUTAJ) LUB (pozycja IN (WYBIERZ T OD @dataInTable)) ). Czy znasz poprawną składnię? –

+1

@ EricYin Prawdopodobnie szukasz "CASE", jeśli chcesz go użyć w "SELECT". Trudno powiedzieć, co robisz na podstawie fragmentów, które opublikowałeś do tej pory. –