sp_send_dbmail-无法附加查询结果

时间:2019-03-01 21:49:15

标签: sql-server sql-server-2008 sql-server-2008-r2

目标是将以下过程嵌入到SQL Server 2008r2作业中,该作业将发送以逗号分隔的文本文件,可由非技术用户在Excel中打开该文本文件。该文件每条记录应具有1行,包括标题,并且不得被截断或填充。总体而言,我认为这是一个非常标准的非特殊文件。

但是,我遇到了多个冲突的问题:

  • 每个单独的字段都放在单独的行上。每行用空格填充为256个字符。这都使该文件几乎不可用,并且太大而无法通过电子邮件发送。设置 @ query_result_no_padding = 1 可解决此问题。
  • 如果每行(包括逗号)超过256个字符,则该行将被截断并复制到下一行。设置 @ query_no_truncate = 1 应该可以解决此问题,但是当 @ query_result_no_padding = 1
  • 时会引发错误
  • 经过一些试验和错误后,我认为@query_no_truncate不适用于标题。列标题粘贴在几行上,我对此感到茫然。文档中的所有选项似乎都不适用于此处。

如何获取查询结果以将其输出到可以在Excel中打开和过滤的标准文本文件中?

    Exec msdb.dbo.sp_send_dbmail
      @profile_name='myserver',
      @reply_to='repliesgoto@here.com',
      @recipients='me@company.com',

      @subject='my subject line',
      @body=@HTMLbody,
      @body_format='html'

      @query='Select * from myserver.dbo.mytable',
      @attach_query_result_as_file = 1,
      @query_attachment_filename='x.txt',
      @query_result_header=1,
      @query_result_separator=',',
      @query_result_no_padding=1,
      --@query_result_width=300,
      --@query_no_truncate=1,

此过程的主要文档:
https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql?view=sql-server-2017

1 个答案:

答案 0 :(得分:0)

我很确定问题出在表中的CHAR数据类型上,因为VARCHAR不会发生此问题。

use tempdb
go
create table dbo.t1 (col1 char(10), col2 char(20));
go
insert into dbo.t1 values ('1', '1')
    , ('2', '2')
    , ('3', '3');
go
select quotename(col1), quotename(col2) from dbo.t1;
go

结果:

[1         ], [1                   ]
[2         ], [2                   ]
[3         ], [3                   ]

现在执行以下操作,但RTRIM列:

EXEC msdb.dbo.sp_send_dbmail 
@profile_name = 'test'
, @recipients = 'x@x.com'
, @reply_to = 'x@x.com'
, @subject = 'test2'
, @body_format = 'HTML'
, @query = 'set nocount on; select rtrim(col1) as col1, rtrim(col2) as col2 from dbo.t1'
, @execute_query_database = 'tempdb'
, @attach_query_result_as_file = 1
, @query_attachment_filename='x.txt'
, @query_result_header=1
, @query_result_separator=',';

通过电子邮件发送附件文件的结果

col1,col2
----,----
1,1
2,2
3,3