【问题标题】:sp_send_dbmail - Cannot attach query resultssp_send_dbmail - 无法附加查询结果
【发布时间】:2019-03-01 21:49:15
【问题描述】:

目标是将以下过程嵌入到 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

【问题讨论】:

  • 看起来问题在于您选择的列是 CHAR。我敢打赌,如果列是 VARCHAR,你会得到预期的结果。

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


【解决方案1】:

我很确定问题出在表中的 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

【讨论】:

  • 我添加了 rtrims 并将字段的数据类型从 NVARCHAR 更改为 VARCHAR(它们不是 CHAR)。我看不到生成的数据文件,但它太大而无法附加到电子邮件(超过 20mb)。您能否确认您使用 2008r2 进行了测试,或者您使用的是更新版本?
  • 数据文件一般应该在1mb左右。但所有这些填充使它 20+
猜你喜欢
  • 2010-11-22
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 2017-12-04
相关资源
最近更新 更多