0

一部のコードを xp_sendmail から切り替えていますが、sp_send_dbmail から期待した結果が得られません。私が試しているクエリは以下のとおりで、メールのメッセージ本文には 1 行しか含まれていません。

私の最初のヘッダー エントリ

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

メッセージ本文をさらに見ると、行はそこにありますが、答えは、その内容の長さではなく、定義された長さまで列を埋めています。したがって、この場合、2 行目は 8000 文字下 (数行) です。

答えは、幅パラメーターを使用して列を短くし、列を短くすることです。RTRIM(...) を使用して、クエリの select ステートメントで Line 列をラップすることを何度か試みましたが、それでも列が定義されたサイズにパディングされます。

于 2012-09-18T04:25:42.020 に答える
0

RTRIM()は入力値を変更せずに返すことがあるため、 の結果は入力RTRIM()と同じサイズになりますvarchar(8000)。この場合は a です。

そのため、システムが結果セットを電子メールにフォーマットしようとするとき、メタデータを調べてvarchar(8000)それを確認し、そのサイズに従ってすべての結果をフォーマットします。

を使用して、本文に直接ではなく、添付ファイルとして結果を含めることをお勧めし@attach_query_result_as_file=1ます。

于 2012-09-18T06:47:55.980 に答える