2012-01-05 18 views
8

Questa è una sezione di uno dei miei stored procedure:Come verificare se una variabile di tabella è vuota in SQL Server?

@dataInTable dbo.Table_Variable readonly, 
.... 

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

@dataInTable IS NULL è sbagliato nella sintassi, l'errore è

Must declare the scalar variable "@dataInTable"

Così ho modificarla in:

(SELECT T FROM @dataInTable) IS NULL 

questo funziona ma se @dataInTable ha più di 1 elemento, viene visualizzato un messaggio di errore:

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

Comprensibile, quindi modificarla in:

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

funziona perfettamente, quello che ho è la prestazione preoccupazione.

Mi chiedo, se ha un modo più semplice per verificare se una variabile di tabella è vuota, come

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

risposta

5

Per controllo se variabile di tabella è vuota, basta usare esiste come già detto da altre persone,

ma

se differiscono insieme vuoto da sconosciuto set - quindi non hai scelta - devi introdurre una variabile extra che indica se il set vuoto è veramente vuoto o sconosciuto.

declare @dataInTableIsUnknown BIT 

... 

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

variabili di tabella sono diverse dalle variabili scalari in modo @dataInTable IS NULL non è permesso come lei ha ricordato. Vorrei suggerire il seguente:

EXISTS (SELECT 1 FROM @dataInTable) 

Quanto segue può anche avere un senso per la propria situazione se effettivamente cura di conoscere il conteggio:

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

C'è sempre exists.

Ad esempio:

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

+1 'EXISTS' può essere più efficiente di' COUNT' poiché si interrompe dopo la prima riga. –

+0

Grazie, ho provato a esistere ma non può essere utilizzato all'interno di una condizione selezionata: E ( (NON POSSO ESSERE POSIZIONARE QUI) O (voce IN (SELEZIONA T DA @dataInTable)) ). Conosci la sintassi corretta –

+1

@EricYin Probabilmente stai cercando 'CASE' se vuoi usarlo in un' SELECT'. Difficile sapere cosa stai facendo in base ai frammenti che hai pubblicato finora. –