2012-04-27 15 views
30

Tôi tạo truy vấn với một số kết quả được sử dụng lại. Tôi tìm kiếm một cách để đưa kết quả vào một biến và sử dụng nó.Truy vấn SQL, kết quả lưu trữ của SELECT trong biến cục bộ

Một cách đơn giản để xem những gì tôi muốn một cái gì đó trông như thế này - tôi muốn điều này:

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 

Không này:

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) 

Nó không phải là kết quả của truy vấn này mà tôi quan tâm với, nhưng thay vào đó:

  1. để ngừng chọn kết quả quá nhiều lần - trong mẫu của tôi, tôi đã chọn lại bảng 3 tim es

  2. truy vấn @result1 thường phức tạp hơn nhiều. Vì vậy, với một biến, mã sẽ sạch hơn.

Có thể tôi muốn nhiều - hoặc có một loại biến cục bộ. Hoặc sử dụng bảng loại và đặt dữ liệu bên trong.

Bạn đề xuất gì cho tôi?

Cảm ơn bạn

Trả lời

36

Bạn có thể tạo các biến bảng:

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 

này nên sử dụng tốt cho những gì bạn cần.

+0

yeah, đó là những gì tôi nghĩ mình nên làm gì. Tôi chỉ đăng nó để biết nếu theres một cách khác. Tank bạn. – forX

11

Dưới đây là một số cách tiếp cận khác mà bạn có thể thực hiện.

1. CTE với công đoàn:

;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 với 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

với cte có vẻ thú vị. không cần phải tạo bảng của mỗi hàng. bể bạn – forX

+0

@AnthonyFaull nhờ câu trả lời. Nhưng, làm thế nào về một câu lệnh 'in (statement)'? –

0

không Đây có phải là một giải pháp đơn giản hơn nhiều, nếu tôi hiểu đúng câu hỏi, tất nhiên.

Tôi muốn tải các địa chỉ email nằm trong một bảng có tên là "spam" vào một biến.

select email from spam 

tạo ra danh sách sau đây, nói:

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

Để tải vào @list biến:

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

@list bây giờ có thể được chèn vào một bảng vv

Tôi hy vọng điều này sẽ hữu ích.

Để sử dụng nó cho a.csv file hoặc trong VB, spike mã:

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

và nó tạo mã làm sẵn để sử dụng ở nơi khác:

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

Một có thể rất sáng tạo.

Cảm ơn

Nico