2011-01-25 6 views
6

Trên SQL Server 2008, tôi đang cố gắng lấy danh sách được phân cách bằng dấu phẩy của tất cả các giá trị đã chọn thành một biến.Ghép các giá trị sql vào một biến

SELECT field 
FROM table 

lợi nhuận:

+-------+ 
| field | 
+-------+ 
| foo | 
+-------+ 
| bar | 
+-------+ 

Tôi muốn nhận được: "foo, quầy bar,"

tôi đã cố gắng:

DECLARE @foo NVARCHAR(MAX) 
SET @foo = '' 

SELECT @foo = @foo + field + ',' 
FROM TABLE 

PRINT @foo 

nào trả về không có gì. Tôi đang làm gì sai?

+2

Bảng của bạn có chứa bất kỳ NULL nào không? –

Trả lời

8

Bạn sẽ cần phải thay đổi NULLs

SELECT @foo = @foo + ISNULL(field + ',', '') 
FROM TABLE 

hoặc loại bỏ chúng

SELECT @foo = @foo + field + ',' 
FROM TABLE 
WHERE field IS NOT NULL 
+1

Xin lỗi, bạn đã giấu tên ... – gbn

+0

Tôi ước tôi có thể upvote một lần nữa vì nó là một câu trả lời hoàn hảo. – VoodooChild

3

Điều đó xảy ra nếu bạn thậm chí còn có trường SINGLE trong bảng là NULL. Trong SQL Server, NULL + <any> = NULL. Hoặc là bỏ qua họ

SELECT @foo = @foo + field + ',' 
FROM TABLE 
WHERE field is not null 

Hoặc làm việc xung quanh họ

SELECT @foo = @foo + isnull(field + ',', '') 
FROM TABLE 

Bạn có thể viết toàn bộ điều mà không báo cáo kết quả SET hàng đầu mà là phổ biến hơn. Truy vấn này dưới đây trả về "foo, bar" không có đuôi dấu phẩy

DECLARE @foo NVARCHAR(MAX) 
SELECT @foo = isnull(@foo + ',', '') + field 
FROM TABLE 
WHERE field is not null 

PRINT @foo 
+0

Tôi sẽ không khuyên bạn nên sử dụng phương pháp này vì nó không đáng tin cậy. Thông tin thêm [Kế hoạch thực hiện và kết quả của truy vấn liên kết tổng hợp phụ thuộc vào vị trí biểu thức] (https://support.microsoft.com/en-us/kb/287515) và [nvarchar concatenation/index/nvarchar (tối đa) hành vi không thể giải thích] (http://stackoverflow.com/questions/15138593/nvarchar-concatenation-index-nvarcharmax-inexplicable-behavior) – lad2025

+0

Nó hoạt động 100% đáng tin cậy trong các hình thức được hiển thị, tức là không có ORDER BY. Nếu không có đơn đặt hàng, biến sẽ tiếp tục phát triển và vào cuối quá trình xử lý, nó vẫn là kết quả cuối cùng. Khi ORDER BY đi vào hoạt động, việc thực thi truy vấn buộc phải giữ lại một tập dữ liệu temp ảo với một số giá trị tạm thời của '@ var' trong mỗi hàng. Sau khi đặt hàng xảy ra trên những "hàng tạm thời" này, một số phiên bản lịch sử của trạng thái '@ variable' được in dưới dạng giá trị cuối cùng của nhiệm vụ. Đạo đức của câu chuyện là - không sử dụng ORDER BY hoặc sử dụng FOR XML. – RichardTheKiwi

1

Đừng quên sử dụng LTRIMRTRIM xung quanh @foo (khi loại dữ liệu là char/varchar) trong kết nối khác, nó sẽ không cung cấp cho dự kiến ​​resul ts trong SQL 2008 R2.