2012-04-27 20 views
30

Creo una consulta con algunos resultados reutilizados. Busco una forma de poner el resultado en una variable y usarlo.Consulta SQL, almacena el resultado de SELECCIONAR en la variable local

Una manera simple de ver lo que yo quiero algo con este aspecto - Quiero esto:

DECLARE @result1 ????? 

SET @result1 = SELECT a,b,c FROM table1 
SELECT a AS val FROM @result1 
UNION 
SELECT b AS val FROM @result1 
UNION 
SELECT c AS val FROM @result1 

No es esto:

SELECT a AS val FROM (SELECT a,b,c FROM table1) 
UNION 
SELECT b AS val FROM (SELECT a,b,c FROM table1) 
UNION 
SELECT c AS val FROM (SELECT a,b,c FROM table1) 

No es el resultado de esta consulta que a mí respecta con, pero en su lugar:

  1. para dejar de seleccionar el resultado tantas veces - en mi muestra, volví a seleccionar la tabla 3 tim es

  2. la consulta de @result1 suele ser mucho más compleja. Entonces, con una variable, el código será más limpio.

Quizás quiero mucho, o hay un tipo de variable local. O usando la tabla de tipos y configurando datos dentro.

¿Qué me sugieres?

Gracias

Respuesta

36

Puede crear variables de tabla:

DECLARE @result1 TABLE (a INT, b INT, c INT) 

INSERT INTO @result1 
SELECT a, b, c 
FROM table1 

SELECT a AS val FROM @result1 
UNION 
SELECT b AS val FROM @result1 
UNION 
SELECT c AS val FROM @result1 

Esto debería estar bien para lo que necesita.

+0

sí, eso era lo que yo creo que debería hacer. Solo lo publico para saber si hay otra manera. Gracias. – forX

11

Aquí hay otros enfoques que puede tomar.

1. CTE con el sindicato:

;WITH cte AS (SELECT a, b, c FROM table1) 
SELECT a AS val FROM cte 
UNION SELECT b AS val FROM cte 
UNION SELECT c AS val FROM cte; 

2. CTE con UNPIVOT:

;WITH cte AS (SELECT a, b, c FROM table1) 
SELECT DISTINCT val 
FROM cte 
UNPIVOT (val FOR col IN (a, b, c)) u; 
+1

con cte parece interesante. No es necesario crear una tabla de cada fila. tanque que – forX

+0

@AnthonyFaull gracias a la respuesta. Pero, ¿qué tal una declaración 'in (declaración)'? –

0

No es esto una solución mucho más simple, si he entendido bien la pregunta, por supuesto.

Quiero cargar las direcciones de correo electrónico que están en una tabla llamada "correo no deseado" en una variable.

select email from spam 

produce la siguiente lista, dicen:

.accountant 
.bid 
.buiilldanything.com 
.club 
.cn 
.cricket 
.date 
.download 
.eu 

para cargar en la variable @List:

declare @list as varchar(8000) 
set @list += @list (select email from spam) 

@List puede ahora ser insertado en una mesa, etc.

Espero que esto ayude.

Para usarlo para a.archivo CSV o en VB, pico el código:

declare @list as varchar(8000) 
set @list += @list (select '"'+email+',"' from spam) 
print @list 

y produce código ya preparado para utilizar en otra parte:

".accountant," 
".bid," 
".buiilldanything.com," 
".club," 
".cn," 
".cricket," 
".date," 
".download," 
".eu," 

Uno puede ser muy creativo.

Gracias

Nico

Cuestiones relacionadas