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