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

时间:2012-09-18 03:08:25

标签: sql 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   

2 个答案:

答案 0 :(得分:0)

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

答案是以某种方式缩短具有width参数和较短列的列。我在查询的select语句中使用RTRIM(...)包装Line列进行了几次尝试,但它仍然将列填充到定义的大小。

答案 1 :(得分:0)

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

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

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