0

I want to use sp_send_dbmail to send table.

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?

M.R
  • 59
  • 1
  • 9
  • 1
    Does this answer your question? [Convert a SQL query result table to an HTML table for email](https://stackoverflow.com/questions/7070053/convert-a-sql-query-result-table-to-an-html-table-for-email) – SMor Jun 15 '20 at 11:19
  • not exactly, I still do not understand how to put the table I pulled into the email body – M.R Jun 16 '20 at 11:08

1 Answers1

1

Procedure only to create a HTML table:

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

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