CSV的SQL Server换行符

时间:2019-05-10 11:48:55

标签: sql sql-server

我正在尝试以CSV格式编写查询,如下所示:

SELECT SUBSTRING
(
    (
        SELECT ',' + [symbol], + ',' + [date] + ',' + [price]
        FROM csvFormatTable
        FOR XML PATH('')
    )
    ,2,200000
) 
AS CSV

,除了行尾的','以外,它通常都能给出正确的结果,但是我确实想用换行符代替它。我见过CHAR(10)和类似的东西,但是它没有换行,而是'#x0D'。上面查询的结果是我下面的内容(没有char(10)的东西):

symbol,date,price,mikeCode,2019-04-10,50,mikeCode,2019-04-11,200,mikeCode,2019-04-12,10,

应位于的位置:

symbol,date,price
mikeCode,2019-04-10,50
mikeCode,2019-04-11,200
mikeCode,2019-04-12,10

需要换行,以便可以将其作为CSV读取。

2 个答案:

答案 0 :(得分:2)

假设您使用的是SQL Server 2016,请使用(N)CHAR(13)(N)CHAR(10)。然后,您需要使用TYPE来避免转义字符,然后使用value来获取值。

SELECT STUFF((SELECT ',' + CHAR(13) + CHAR(10) + [symbol] + 
                     ',' + [date] + ',' + [price]
             FROM csvFormatTable
             FOR XML PATH(''),TYPE).value('.','varchar(MAX)'),1,3,'') AS CSV;

如果您在SQL Server 2017+上,则可以使用STRING_AGG

SELECT STRING_AGG(CHAR(13) + CHAR(10) + ',' + [symbol] + ',' + [date] + ',' + [price],CHAR(13) + CHAR(10))
FROM csvFormatTable --Untested

db<>fiddle

答案 1 :(得分:0)

由于@Larnu,我更改了SMSS中的设置(有关如何执行此操作的链接在此处): How to correctly insert newline in nvarchar

我只是稍微修改了一下查询以获取所需的结果

    DECLARE @SQL NVARCHAR(MAX)
    SET @SQL =
    '
        DECLARE @test NVARCHAR(MAX)
        SET @test = (SELECT STRING_AGG(CHAR(10) + [symbol] + '','' + [date] + '','' + [price], CHAR(13) ) FROM csvFormatTable)
        SELECT @test
    '

EXEC(@SQL)