2009-04-03 3 views
5

Perché SQL Server insiste che la tabella temporanea esiste già! l'uno o l'altro accadrà !! , quindi non sarà mai il caso.Utilizzo di tabelle temporanee in IF .. Istruzioni ELSE

declare @checkvar varchar(10) 
declare @tbl TABLE(colx varchar(10)) 
set @checkvar ='a' 

INSERT INTO @tbl (colx) VALUES('a') 
INSERT INTO @tbl (colx) VALUES('b') 
INSERT INTO @tbl (colx) VALUES('c') 
INSERT INTO @tbl (colx) VALUES('d') 

IF @checkvar is null select colx INTO #temp1 FROM @tbl 
ELSE select colx INTO #temp1 FROM @tbl WHERE colx [email protected] 

errore: esiste già un oggetto denominato "# temp1" nel database.

C'è un modo elegante intorno a questo? se @checkvar è nullo, voglio l'intera tabella altrimenti, dammi solo i valori in cui @checkvar = qualcosa

EDIT: la colonna è un varchar, non un int.

risposta

5

Non puoi semplicemente riscrivere la dichiarazione?

SELECT colx INTO #temp1 FROM @tbl WHERE (@checkvar IS NULL) OR (colx = @checkVar) 
+0

Ok. Ho cambiato il mio suggerimento –

2
drop table #temp1 

select colx into #temp1 
from @tbl 
where (ISNULL(@checkvar,'0')='0' or [colx] = @checkvar) 

Se @checkvar esiste, utilizzerà questo, dove dichiarazione, altrimenti restituirà tutti i dati. Puoi cambiare lo "0" in qualsiasi cosa vuoi, purché non sia mai il valore iniziale di @checkvar.

+0

furtivamente, hai ingannato l'affermazione in un 0 = 0 –

+0

finché fa il trucco :) – Peter

3

Se questa è una stored procedure, SELECT .. INTO causerà una ricompilazione della procedura.

Da quello che ho capito, è meglio creare la tabella nella parte superiore della procedura, e in seguito fare i normali INSERT.

Quindi, Id suggeriscono:

CREATE TABLE #temp1 (colx ...) 

DECLARE @checkvar VARCHAR(10) 
DECLARE @tbl TABLE(colx varchar(10)) 
SET @checkvar ='a' 

INSERT INTO @tbl (colx) VALUES('a') 
INSERT INTO @tbl (colx) VALUES('b') 
INSERT INTO @tbl (colx) VALUES('c') 
INSERT INTO @tbl (colx) VALUES('d') 

IF @checkvar IS NULL 
BEGIN 
    INSERT INTO #temp1(colx) 
    SELECT colx 
    FROM @tbl 
END 
ELSE 
BEGIN 
    INSERT INTO #temp1(colx) 
    SELECT colx 
    FROM @tbl WHERE colx [email protected] 
END 

Inoltre, in questo modo ci si libera del OR citato da altre soluzioni (OR del sono il male;)

/B

6

È possibile creare un tabella temporanea vuota con la struttura desiderata utilizzando WHERE 1=0. Quindi inserisci i record desiderati con il tuo codice originale

SELECT colx INTO #temp1 
FROM @tbl 
WHERE 1 = 0 // this is never true 

IF @checkvar IS NULL 
BEGIN 
    INSERT INTO #temp1 (colName) 
    SELECT colx FROM @tbl 
END 
ELSE 
BEGIN 
    INSERT INTO #temp1 (colName) 
    SELECT colx 
    FROM @tbl 
    WHERE colx = @checkvar 
END