简体   繁体   English

如何使用 sp_send_dbmail 发送表 - sql 服务器

[英]how to use sp_send_dbmail to send table - sql server

I want to use sp_send_dbmail to send table.我想使用 sp_send_dbmail 发送表。

i did that:我这样做了:

create PROCEDURE [dbo].[sp_ABC]

AS
BEGIN

    SET NOCOUNT ON;

    DECLARE 

        @MailSubject nvarchar(500),
        @dataTable nvarchar(max),
        @HTMLcontent nvarchar(max),
        @query nvarchar(max)

    select * 
    into #T1
    from my_table


SET @MailSubject = N'aaa'
SET @HTMLcontent = @HTMLcontent + @dataTable + '</Table>'


EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'AAA',
        @body_format = 'HTML',
        @recipients = 'ABC@gmail.com',
        @body = @HTMLcontent, 
        @subject = @MailSubject

Drop table #T1
END

but i didn't get any mail.但我没有收到任何邮件。

My question is how do I put the table I pulled into the email body?我的问题是如何将我拉到的桌子放入 email 主体中?

Procedure only to create a HTML table:仅创建 HTML 表的过程:

CREATE PROCEDURE [dbo].[PRC_HTML_TABLE] (@TABLE AS NVARCHAR(MAX)=NULL OUTPUT) AS BEGIN
 
    IF @TABLE IS NULL BEGIN
        PRINT 'Create a HTML code from a table to send in mail' --Vathaire 29/07/2019
        RETURN
    END
    IF LEFT(@TABLE, 1) != '#' BEGIN
        PRINT 'Use the parameter @TABLE as the name of your table (from Tempdb) and with OUTPUT, it will return the HTML'
        PRINT 'ENVIE O @TABLE COMO O NOME DA SUA TABELA (EM TEMPDB) E COM OUTPUT, IRÁ RETORNAR O HTML'
        RETURN
    END
    DECLARE @TEMPDBDBOTABLE AS NVARCHAR(MAX) = 'TEMPDB.DBO.' + @TABLE
    EXEC MF_DROP #FULLXML
    CREATE TABLE #FULLXML (X NVARCHAR(MAX))
    DECLARE @COLS VARCHAR(MAX) = STUFF(
        (SELECT ',"' + NAME + '" = ISNULL(CONVERT(NVARCHAR(MAX), ' + NAME + '), '''')'
        FROM TEMPDB.sys.columns
        WHERE OBJECT_ID = OBJECT_ID(@TEMPDBDBOTABLE) FOR XML PATH('')), 1, 1, '') --ISNULL needed so it dont break the table Vathaire 06/09/2019
    INSERT INTO #FULLXML
        EXEC('SELECT (SELECT ' + @COLS
        + ' FROM ' + @TABLE + ' FOR XML PATH(''tr''))')
    SET @COLS = STUFF((SELECT ',' + NAME FROM TEMPDB.sys.columns WHERE OBJECT_ID = OBJECT_ID(@TEMPDBDBOTABLE) FOR XML PATH('')), 1, 1, '')
    DECLARE @COL AS VARCHAR(MAX)
        , @E AS NVARCHAR(MAX) = '</tr></thead><tbody>' + (SELECT * FROM #FULLXML) + '</tbody></table>'
        , @H AS NVARCHAR(MAX) = '<table border=1><thead><tr>'
    
    WHILE @COLS IS NOT NULL BEGIN
        EXEC MF_SPLIT @COLS OUTPUT, @COL OUTPUT
        SELECT 
            @H = @H + '<th>' + @COL + '</th>'
            , @E = REPLACE(REPLACE(@E, '<' + @COL + '>', '<td>'), '</' + @COL + '>', '</td>')
    END
    SET @TABLE = @H + @E
END

within this process: MF_SPLIT code在这个过程中: MF_SPLIT代码

Example:例子:

--> Create a temp table
SELECT TOP 10 * 
INTO #TEMP
FROM SYS.all_objects

--> Declare a variable using the name of the table
DECLARE @MAILBODY VARCHAR(MAX) = '#TEMP'
--> Call the procedure with OUTPUT
EXEC PRC_HTML_TABLE @MAILBODY OUT

SET @MAILBODY = 'Dears,<BR><BR>This is the result:<BR><BR>' + @MAILBODY + '<BR><BR>'

EXEC MSDB..sp_send_dbmail 
    '[profile_name]'
    ,'[recipients]'
    ,@BODY=@MAILBODY
    ,@BODY_FORMAT='HTML' --> Important

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM