我正在从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
将结果作为附件包含在内,而不是直接在正文中。