2012-04-27 14 views
30

Tworzę zapytanie z kilkoma ponownymi wynikami. Przeszukuję sposób, aby umieścić wynik w zmiennej i użyć go.Zapytanie SQL, wynik zapisu SELECT w zmiennej lokalnej

Prosty sposób, aby zobaczyć to, co chcę coś wygląda tak - chcę to:

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 

Nie tym:

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) 

To nie jest wynikiem tego zapytania, że ​​jestem zaniepokojony z, ale zamiast:

  1. zatrzymać wybierając rezultatem tak wiele razy - w moim próbki, ja wybrać ponownie tabelę 3 tim es

  2. zapytanie @result1 jest zwykle bardziej złożone. Zatem, ze zmienną, kod będzie czystszy.

Może chcę dużo - lub istnieje typ zmiennej lokalnej. Lub użyj tabeli typów i ustaw dane w środku.

Co mi sugerujesz?

Dziękuję

Odpowiedz

36

Można tworzyć zmienne tabeli:

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 

to powinno być w porządku za to, co trzeba.

+0

tak, to było to, co myślę, że należy zrobić. Po prostu publikuję to, aby wiedzieć, czy istnieje inny sposób. Tankuj cię. – forX

11

Oto kilka innych metod, które można zastosować.

1. CTE z Unii:

;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 z 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

z cte wydaje się interesujący. Nie trzeba tworzyć tabeli z każdego rzędu. tank you – forX

+0

@AnthonyFaull dzięki odpowiedzi. Ale co powiesz na instrukcję 'in (statement)'? –

0

Czy nie jest to dużo prostsze rozwiązanie, jeśli dobrze rozumiem pytanie, oczywiście.

Chcę załadować adresy e-mail znajdujące się w tabeli o nazwie "spam" do zmiennej.

select email from spam 

produkuje poniższej listy, powiedzmy:

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

załadować do zmiennej @list:

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

@list może teraz być włożona do stołu, itp

Mam nadzieję, że to pomoże.

Aby użyć go jako pliku.plik CSV lub w VB, skok ten kod:

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

i produkuje gotowy kod do wykorzystania w innym miejscu:

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

One mogą być bardzo oszczędny.

Dzięki

Nico