2009-01-18 8 views

Répondre

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

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

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

PRINT @result 

Si Column peut être NULL, soit exclure d'abord, ou utiliser ISNULL/COALESCE - sinon un seul NULL va briser toute la séquence. Il est plus efficace d'exclure un WHERE:

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

fonctionne comme annoncé. Merci. pour ceux qui pourraient le trouver plus tard, il est facile de supprimer la dernière virgule: 'select @result = substring (@result, 1, (LEN (@result) -1))' –

+0

Attention au boîtier de longueur nulle ... –

+7

SELECT @result = COALESCE (@result + N ',', N '') + [Colonne] évitera la dernière virgule sans pénalité de perf. –

10

sans la version virgule finale:

declare @s varchar(max); 

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

print @s; 
+0

Je m'attendrais à utiliser quelques cycles de processeur de plus, bien que ... personnellement, si j'avais besoin de le couper, j'utiliserais les fonctions de chaîne à la place. –

+0

Les chaînes MSSQL sont immuables, je m'attendrais à ce que la copie de grandes chaînes (le découpage produise aussi une copie) entraînerait aussi des cycles de processeur, mais je ne suis pas sûr. Je pense que s'il s'agit d'une chose ponctuelle, les micro-optimisations ne sont pas justifiées. –

+0

Je voudrais utiliser coalesce au lieu de isnull – B4ndt

1

J'ai créé un proc qui permettra de créer dynamiquement un fichier CSV sur une table arbitraire, sans besoin de spécifier explicitement les colonnes. Ceci est utile si vous ne voulez pas écrire de code personnalisé chaque fois que vous voulez transformer une table SQL en une chaîne 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 

Utilisation:

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

Ceci est basé sur un code similaire, j'ai écrit pour transformer une table arbitraire dans un HTML string.

Questions connexes