2009-01-18 26 views

Respuesta

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

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

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

PRINT @result 

Si Column puede ser nulo, entonces o bien excluirlo primera o bien utiliza ISNULL/COALESCE - de lo contrario un solo NULL se romperá toda la secuencia. Es más eficiente para excluirlo con un WHERE:

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

funciona como se anuncia. Gracias. para aquellos que pueden encontrar esto más tarde, es fácil eliminar la última coma: 'select @result = substring (@result, 1, (LEN (@result) -1))' –

+0

Solo ten cuidado con el caso de longitud cero ... –

+7

SELECCIONE @result = COALESCE (@result + N ',', N '') + [Columna] evitará la última coma sin penalización de perf. –

10

sin la versión de arrastre coma:

declare @s varchar(max); 

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

print @s; 
+0

Sin embargo, esperaría usar algunos ciclos más de CPU ... personalmente, si tuviera que recortarla, utilizaría las funciones de cadena en su lugar. –

+0

Las cadenas de MSSQL son inmutables, espero que copiar grandes cadenas (recortar también produzca una copia) también incurriría en algunos ciclos de CPU, aunque no estoy seguro. Creo que si se trata de algo único, las micro optimizaciones no están garantizadas. –

+0

Usaría coalesce en lugar de isnull – B4ndt

1

He creado un proc que dinámicamente creará un archivo CSV de cualquier tabla arbitraria, sin necesidad de especificar explícitamente las columnas. Esto es útil si no desea escribir código personalizado cada vez que quiera convertir una tabla SQL en una cadena 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 

Uso:

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

Esto se basa en un código similar que escribió para convertir una tabla arbitraria en un HTML string.

Cuestiones relacionadas