sp_send_dbmail不会从消息中的查询发送多行



我正在从xp_sendmail切换一些代码,但没有得到我期望从sp_send_dbmail获得的结果。 我正在尝试的查询如下,电子邮件中的邮件正文仅包含一行:

我的第一个标题条目

Microsoft真的将其设计为仅返回单行查询(例如 COUNT(*) 或 TOP 1)的答案吗? 有没有办法将整组行作为文本获取?

DECLARE @tLog TABLE (Sequence INT IDENTITY(1,1), [Rank] TINYINT DEFAULT 1, Line VARCHAR(8000))
INSERT INTO @tLog ([Line]) VALUES ('My first log entry')
INSERT INTO @tLog ([Line]) VALUES ('My first second entry')
/* ... processing ... */
INSERT INTO @tLog ([Rank], [Line]) VALUES (0, 'My first header entry')
/* Global Temp for visibility in sp_send_dbmail */
SELECT Sequence, [Rank], Line 
INTO ##tResult1
FROM @tLog 
ORDER BY [Rank], Sequence
/* to validate table content only */
SELECT Sequence, [Rank], Line 
FROM ##tResult1
ORDER BY [Rank], Sequence
EXEC msdb.dbo.sp_send_dbmail 
    @profile_name = 'MyProfile',
    @recipients='me@myaddress.net',
    @subject = 'test',
    @body_format = 'text',
    @body = '',
    @query_result_header = 0,
    @query_no_truncate = 1,
    @query = 'SELECT Line FROM ##tResult1 ORDER BY [Rank], Sequence'
DROP TABLE ##tResult1   

进一步查看消息正文时,行在那里,但答案是将列填充到其定义的长度,而不是其内容的长度。 因此,在这种情况下,第二行向下是 8000 个字符(几行)。

答案是以某种方式缩短带有宽度参数的列和更短的列。 我已经多次尝试使用 RTRIM(...) 将 Line 列包装在查询的 select 语句中,但它仍然将列填充到定义的大小。

由于RTRIM()可能返回其输入值不变,因此RTRIM()的结果与其输入的大小相同 - 在这种情况下是varchar(8000)

因此,当系统尝试将结果集格式化为电子邮件时,它会查阅元数据,看到它已varchar(8000),然后根据该大小设置所有结果的格式。

我建议使用@attach_query_result_as_file=1将结果作为附件包含在内,而不是直接在正文中。

相关内容

  • 没有找到相关文章

最新更新