我正在从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
答案 0 :(得分:0)
当进一步查看消息体时,行就在那里,但答案是将列填充到其定义的长度,而不是其内容的长度。所以在这种情况下,第二行是8000个字符(几行)。
答案是以某种方式缩短具有width参数和较短列的列。我在查询的select语句中使用RTRIM(...)包装Line列进行了几次尝试,但它仍然将列填充到定义的大小。
答案 1 :(得分:0)
由于RTRIM()
可能会返回其输入值不变,因此RTRIM()
的结果与其输入的大小相同 - 在这种情况下为varchar(8000)
。
因此,当系统尝试将结果集格式化为电子邮件时,它会查询元数据,看到它是varchar(8000)
,然后根据该大小格式化所有结果。
我建议使用@attach_query_result_as_file=1
将结果作为附件包含在内,而不是直接包含在正文中。