SQL Server:转义字符串中的标点符号

4
我将从SQL Server表中导出数据到一个.csv文件,然后使用sp_send_email将带有数据的文件发送电子邮件。
我的问题在于这个值:
Cantata Number 212 "Peasants Cantata", BWV 212

这个值在被发送的 .csv 文件中被分成了两列。这个值应该只在一列中。

有些标题可能包含逗号,对于这些情况,逗号需要保留在字符串中。

例如:

Cantata Number 212 Peasants Cantata"     BWV 212"

我尝试过这种方法,但是没有起作用: 注意:这个SELECT语句嵌套在视图vw_WeeklyReport中。
SELECT TOP 100 PERCENT
    '"' + [p].[Title] + '"' [Title]
FROM
    table

导出数据并发送电子邮件 .csv 文件的代码:

BEGIN
    SET NOCOUNT ON;

    DECLARE @qry VARCHAR(8000);

    -- Create the query, concatenating the column name as an alias
    SET @Qry = 'SET NOCOUNT ON; SELECT Title FROM [vw_WeeklyReport] SET NOCOUNT OFF';

    -- Send the e-mail with the query results in attachment.
    EXEC [msdb].[dbo].[sp_send_dbmail] 
                @profile_name = 'default',
                @recipients = '6lack@email.com',
                @subject = 'Weekly Report',
                @body = 'An attachment has been included in this email.',
                @query_attachment_filename = 'WeeklyRep.csv',
                @query = @qry,
                @attach_query_result_as_file = 1,
                @query_result_separator = ',',
                @query_result_width = 32767,
                @query_result_no_padding = 1;
END;

如果可以去掉逗号,你应该考虑在SQL中使用“replace”来实现这一点。 - user2366842
一些值会包含逗号,因此在字符串中保留逗号是必要的。 - the_lone_note
另一个选择是重新设计导出功能,使用除逗号以外的不同分隔符,但这可能超出了单个SO问题的范围。 - user2366842
你知道还有哪些分隔符可以使用吗?我尝试了分号,但当我使用它时,.csv文件中的所有数据都在一个列中。 - the_lone_note
你可以使用任何分隔符。实际上,CSV只是一个格式化的文本文档。你可能需要修改当前解析CSV的任何内容,但正如我所说,这超出了单个SO问题的范围。 - user2366842
2个回答

1
当字段中有逗号(或分隔符)时,该字段应该用双引号括起来,并且其中的任何双引号都必须用另一个双引号进行转义:
"Cantata Number 212 ""Peasants Cantata"", BWV 212"

一旦在字段周围使用双引号,所有包含双引号的字段也应该被引用,并且内部引号也需要转义。
也许你可以寻找一个选项来使用带引号的字段导出到CSV。
删除所有逗号也是一个选择,但这样会失去一些信息。
另一方面,如果只有一列(就像你的SELECT语句中那样),根本不需要使用CSV。可以使用纯文本文件代替。

还有其他列,我只包含了一个让我感到困扰的列。 - the_lone_note
@the_lone_note 好的,那么你需要按照上面所示的格式化字段(或者如果有导出选项的话可以使用导出选项)。或者在您的字段中将 " 替换为 "" - Danny_ds

0

将存储过程中的查询更改为以下内容:

SET @Qry = 'SET NOCOUNT ON; SELECT replace(Title, ',', '') as Title FROM [vw_WeeklyReport] SET NOCOUNT OFF';

请注意,这是未经测试的,但应该可以给您想要的结果。这是在假设去除逗号是可接受的前提下进行的,正如最初的帖子中所指出的那样。如果逗号需要保持完整,答案就不那么简单了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接