如何使用带有SQL的sp_send_dbmail存储过程将查询结果以csv形式通过电子邮件发送?

t3psigkw  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(153)

我想发送一封包含查询结果的电子邮件作为csv附件。
到目前为止,我有这个;

EXEC msdb.dbo.sp_send_dbmail
    @recipients='me@myself.com',
    @subject='CSV Extract', 
    @profile_name = 'Valid profile',
    @body='See attachment',
    @query ='SELECT TOP 10 c.* FROM MyDb.dbo.Customers c',
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'CSV_Extract.csv',
    @query_result_separator = ','

我收到了带有csv附件的电子邮件,但当在Excel中打开时,结果的格式非常糟糕(eidogg.所有值都在一个单独的列中,并带有看似随机的缩进)
我应该怎么做才能得到一个格式正确的结果,列标题也正确?

编辑

我已经向查询添加了以下参数;

@query_result_width = 32767,
@query_result_no_padding = 1

这改善了很多事情,但我仍然得到每一个记录在一个单一的列时,在Excel中打开。如何将记录中的每个值放入它自己的列中?
这是我目前得到的;

这就是我想要的

brjng4g3

brjng4g31#

问题是Excel不理解列。要解决这个问题,您需要向Excel发送说明,解释csv文件。
指令必须是文件的第一部分,在数据之前,因此您必须为查询中包含Excel指令沿着所需实际名称的第一个字段创建别名
指令是“sep=,”,以确保excel能够理解逗号字段分隔符。

DECLARE @column1name varchar(50)

-- Create the column name with the instrucation in a variable
SET @Column1Name = '[sep=,' + CHAR(13) + CHAR(10) + 'Name]'
DECLARE @qry varchar(8000)

-- Create the query, concatenating the column name as an alias
SELECT @qry='set nocount on; SELECT TOP 10 c.CCustName ' + @column1name + 
         ' ,c.CID Id FROM MyDb.dbo.Customers c'

EXEC msdb.dbo.sp_send_dbmail
    @recipients='me@myself.com',
    @subject='CSV Extract', 
    @profile_name = 'Valid Profile',
    @body='See attachment',
    @query =@qry,
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'CSV_Extract.csv',
    @query_result_separator = ',',
    @query_result_width = 32767,
    @query_result_no_padding = 1

这些是最终的结果;

它并不完美(第二行很烦人),但对于我的目的来说,它确实足够好了

bqujaahr

bqujaahr2#

也可以使用@query_result_separator = ' ',
制表符分隔符
替换@query_result_separator = ',',

相关问题