2009-04-03 16 views
5

¿Por qué SQL Server insiste en que la tabla temporal ya existe? ¡uno u otro sucederá! así que nunca será el caso.Uso de tablas temporales en instrucciones IF .. 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] 

error es: Ya hay un objeto llamado '# temp1' en la base de datos.

¿Hay una forma elegante de evitar esto? si @checkvar es nulo, quiero toda la tabla lo contrario, dame sólo los valores donde @checkvar = algo

EDIT: la columna es un varchar, no un int.

Respuesta

5

¿No puede simplemente reescribir la declaración?

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

Ok. Cambié mi sugerencia –

2
drop table #temp1 

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

Si @checkvar existe, se utilice este comunicado donde, de lo contrario se devolverá todos los datos. Puede cambiar el '0' en cualquier cosa que desee, siempre que nunca sea el valor inicial de @checkvar.

+0

furtivo, engañas la declaración en un 0 = 0 –

+0

, siempre y cuando haga el truco :) – Peter

3

Si se trata de un procedimiento almacenado, SELECCIONAR ... INTO provocará una recompilación del procedimiento.

Por lo que entiendo, es mejor crear la tabla en la parte superior del procedimiento, y luego hacer INSERTES normales.

Así, Id sugieren:

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 

Además, esta forma de deshacerse de la O ha mencionado en otras soluciones (o son malos;)

/B

6

Se puede crear una tabla temporal vacía con la estructura deseada usando WHERE 1=0. Luego inserte los registros deseados con su código original

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