0

我正在从 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   
4

2 回答 2

0

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

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

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

于 2012-09-18T06:47:55.980 回答
0

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

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

于 2012-09-18T04:25:42.020 回答