2009-01-18 34 views

Trả lời

22
DECLARE @result nvarchar(max) 
SET @result = '' 

SELECT @result = @result + [Column] + N',' 
FROM [TABLE] 

--TODO: trim last ',' if you require 

PRINT @result 

Nếu Column có thể được null, sau đó, hoặc loại trừ nó lần đầu tiên, hoặc sử dụng ISNULL/COALESCE - nếu không một đơn NULL sẽ phá vỡ toàn bộ chuỗi. Đó là hiệu quả hơn để loại trừ nó với một WHERE:

SELECT @result = @result + [Column] + N',' 
FROM [TABLE] 
WHERE [Column] IS NOT NULL 
+1

hoạt động như được quảng cáo. cảm ơn. đối với những người có thể tìm thấy điều này sau, thật dễ dàng để loại bỏ dấu phẩy cuối cùng: 'select @result = substring (@result, 1, (LEN (@result) -1))' –

+0

Chỉ cần chú ý đến trường hợp độ dài bằng 0 ... –

+7

SELECT @result = COALESCE (@result + N ',', N '') + [Cột] sẽ tránh dấu phẩy cuối cùng mà không bị phạt. –

10

mà không có phiên bản dấu phẩy:

declare @s varchar(max); 

select @s = isnull(@s + ', ' + lastname, lastname) 
from person 
order by lastname; 

print @s; 
+0

Tôi mong muốn sử dụng thêm vài chu trình CPU, mặc dù ... cá nhân, nếu tôi cần cắt nó, tôi sẽ sử dụng các hàm chuỗi thay thế. –

+0

MSSQL dây là không thay đổi, tôi mong đợi rằng sao chép dây lớn (cắt tỉa cũng sẽ mang lại một bản sao) cũng sẽ phải chịu một số chu kỳ CPU, tôi không chắc chắn mặc dù. Tôi nghĩ rằng nếu nó là một điều một lần, tối ưu hóa vi không được bảo hành. –

+0

Tôi sẽ sử dụng kết hợp thay vì isnull – B4ndt

1

Tôi đã tạo một proc rằng động sẽ tạo ra một CSV ra khỏi bất kỳ bảng tùy ý, mà không cần chỉ định rõ ràng các cột. Điều này rất hữu ích nếu bạn không muốn viết mã tùy chỉnh mỗi lần bạn muốn biến một bảng SQL thành một chuỗi CSV.

-- Description: Turns a query into a formatted CSV. 
-- Any ORDER BY clause needs to be passed in the separate ORDER BY parameter. 
CREATE PROC [dbo].[spQueryToCsv] 
(
    @query nvarchar(MAX), --A query to turn into CSV format. It should not include an ORDER BY clause. 
    @orderBy nvarchar(MAX) = NULL, --An optional ORDER BY clause. It should contain the words 'ORDER BY'. 
    @csv nvarchar(MAX) = NULL OUTPUT --The CSV output of the procedure. 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF @orderBy IS NULL BEGIN 
    SET @orderBy = ''; 
    END 

    SET @orderBy = REPLACE(@orderBy, '''', ''''''); 

    DECLARE @realQuery nvarchar(MAX) = ' 
    DECLARE @headerRow nvarchar(MAX); 
    DECLARE @cols nvarchar(MAX); 

    SELECT * INTO #dynSql FROM (' + @query + ') sub;  

    SELECT @cols = ISNULL(@cols + '' + '''','''' + '', '''') + ''''''"'''' + ISNULL(REPLACE(CAST(['' + name + ''] AS nvarchar(max)), ''''"'''', ''''""''''), '''''''') + ''''"'''''' 
    FROM tempdb.sys.columns 
    WHERE object_id = object_id(''tempdb..#dynSql'') 
    ORDER BY column_id;   

    SET @cols = '' 
     SET @csv = (SELECT '' + @cols + '' FROM #dynSql ' + @orderBy + ' FOR XML PATH(''''m_m'''')); 
     '' 
    EXEC sys.sp_executesql @cols, N''@csv nvarchar(MAX) OUTPUT'', @[email protected] OUTPUT  

    SELECT @headerRow = ISNULL(@headerRow + '','', '''') + ''"'' + REPLACE(name, ''"'', ''""'') + ''"'' 
    FROM tempdb.sys.columns 
    WHERE object_id = object_id(''tempdb..#dynSql'') 
    ORDER BY column_id; 

    SET @headerRow = @headerRow + CHAR(13) + CHAR(10); 

    SET @csv = @headerRow + @csv;  
    '; 

    EXEC sys.sp_executesql @realQuery, N'@csv nvarchar(MAX) OUTPUT', @[email protected] OUTPUT 
    SET @csv = REPLACE(REPLACE(@csv, '<m_m>', ''), '</m_m>', CHAR(13) + CHAR(10)) 
END 

GO 

Cách sử dụng:

DECLARE @csv nvarchar(max) 
EXEC [dbo].[spQueryToCsv] @query = 'SELECT * FROM Customers', @csv = @csv OUTPUT, @orderBy = 'ORDER BY CustomerId' 
SELECT @csv 

này được dựa trên mã tương tự như tôi đã viết để biến một bảng tùy ý vào một HTML string.

Các vấn đề liên quan