2012-04-27 34 views
30

Creo una query con alcuni risultati riutilizzati. Cerco un modo per mettere il risultato in una variabile e usarlo.Query SQL, memorizza il risultato di SELECT nella variabile locale

Un modo semplice per vedere quello che voglio qualcosa di simile a questo - voglio che questo:

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 

Non questo:

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) 

Non è il risultato di questa query che mi riguarda con, invece:

  1. per interrompere la selezione del risultato tante volte - nel mio esempio, ho riselezionato la tabella 3 tim es

  2. la query di @result1 è in genere molto più complessa. Quindi, con una variabile, il codice sarà più pulito.

Forse voglio molto - o c'è un tipo di variabile locale. Oppure usa la tabella dei tipi e imposta i dati all'interno.

Cosa mi suggerisci?

Grazie

risposta

36

È possibile creare le variabili di tabella:

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 

Questo dovrebbe andare bene per quello che ti serve.

+0

sì, questo era quello che penso che dovrei fare. L'ho appena pubblicato per sapere se c'è un altro modo. Grazie. – forX

11

Ecco alcuni altri approcci che è possibile adottare.

1. CTE con l'unione:

;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 sembra interessante. non è necessario creare la tabella di ogni riga. tank you – forX

+0

@AnthonyFaull grazie per la risposta. Ma che ne dici di una frase 'in (statement)'? –

0

Non è questa una soluzione molto più semplice, se ho capito bene la domanda, ovviamente.

Desidero caricare gli indirizzi di posta elettronica presenti in una tabella denominata "spam" in una variabile.

select email from spam 

produce il seguente elenco, dire:

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

caricare nel @List variabile:

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

@List può ora essere inserita in una tabella, ecc

Spero che questo aiuti.

Per utilizzarlo per a.file CSV o in VB, Spike il codice:

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

e produce codice già pronti da utilizzare altrove:

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

Si può essere molto creativi.

Grazie

Nico

Problemi correlati