用于CSV的SQL Server换行符

用于CSV的SQL Server换行符,sql,sql-server,Sql,Sql Server,我正在尝试以CSV格式编写查询,如下所示: SELECT SUBSTRING ( ( SELECT ',' + [symbol], + ',' + [date] + ',' + [price] FROM csvFormatTable FOR XML PATH('') ) ,2,200000 ) AS CSV 除了行尾的“”,“”之外,它基本上给出了正确的结果,但我确实想用换行符替换它。我见过CHAR(10)和类似的东西,

我正在尝试以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

它需要换行符,以便可以作为CSV读取。

假设您使用的是SQL Server 2016-然后使用
(N)CHAR(13)
(N)CHAR(10)
。然后,您需要使用
键入
,以避免字符转义,然后使用
获取值

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\u AGG

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

假设您使用的是SQL Server 2016-然后使用
(N)CHAR(13)
(N)CHAR(10)
。然后,您需要使用
键入
,以避免字符转义,然后使用
获取值

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\u AGG

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

多亏了@Larnu,我更改了SMS中的设置(有关如何执行此操作的链接位于此处):

我只是稍微改变了一下我的查询,以得到想要的结果

    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)

感谢@Larnu,我更改了SMS中的设置(有关如何执行此操作的链接位于此处):

我只是稍微改变了一下我的查询,以得到想要的结果

    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)

不幸的是,当我将结果粘贴到CSV文件中时,两者都没有换行符。我在想,如果我将结果串起来,然后尝试添加换行符,这可能更容易做到。这是因为您的SSMS设置@Noobcoder,而不是SQL。我启用了
Retain CR/LF on copy或Save
的勾选框,但启用了
CHAR(13)+CHAR(10)
仍在显示
#x0D
@NoobCoder,这在我提供的代码中是不可能的。稍后我会发布一个DB fiddle来确认,但是如果你得到转义字符,你就做错了。不幸的是,当我将结果粘贴到CSV文件中时,两者都没有换行符。我在想,如果我将结果串起来,然后尝试添加换行符,这可能更容易做到。这是因为您的SSMS设置@Noobcoder,而不是SQL。我启用了
Retain CR/LF on copy或Save
的勾选框,但启用了
CHAR(13)+CHAR(10)
仍在显示
#x0D
@NoobCoder,这在我提供的代码中是不可能的。稍后我会发布一个DB提琴来确认,但是如果你得到转义字符,你就做错了。csvFormatTable中有什么内容?它是一个类似CSV格式的表,exmaple:[symbol][date][price]1 mikeCode 2019-04-10 50没有任何意义。你真的应该编辑你的问题并发布一个示例什么是CSV格式?这是一个类似CSV格式的表格,exmaple:[symbol][date][price]1 mikeCode 2019-04-10 50没有任何意义。你真的应该编辑你的问题并发布一个例子