2017-04-11 1 views
0
CREATE TABLE #Temp 
( 
    [Rank] [int], 
    [Player Name] [varchar](128), 
    [Ranking Points] [int], 
    [Country] [varchar](128) 
) 

INSERT INTO #Temp 
    SELECT 1, 'Rafael Nadal', 12390, 'Spain' 
    UNION ALL 
    SELECT 2, 'Roger Federer', 7965, 'Switzerland' 
    UNION ALL 
    SELECT 3, 'Novak Djokovic', 7880, 'Serbia' 


DECLARE @xml NVARCHAR(MAX) 
DECLARE @body NVARCHAR(MAX) 

SET @xml = CAST((SELECT [Rank] AS 'td','',[Player Name] AS 'td','', 
     [Ranking Points] AS 'td','', Country AS 'td' 
FROM #Temp ORDER BY Rank 
FOR XML PATH('tr'), ELEMENTS) AS NVARCHAR(MAX)) 

SET @body ='<html><body><H3>Tennis Rankings Info</H3> 
<table border = 1> 
<tr> 
<th> Rank </th> <th> Player Name </th> <th> Ranking Points </th> <th> Country </th></tr>'  

SET @body = @body + @xml +'</table></body></html>' 

EXEC msdb.dbo.sp_send_dbmail 
    @profile_name = 'SQL ALERTING', -- replace with your SQL Database Mail Profile 
    @body = @body, 
    @body_format ='HTML', 
    @recipients = '[email protected]', -- replace with your email address 
    @subject = 'E-mail in Tabular Format' ; 

#Tempテーブルが構造的に動的になり、つまり列が変化し続けるという要件があります。とにかく動的表のために@xml変数を構築していますか?前もって感謝します。どんな助けも高く評価されます!SQL Serverで電子メールを送信するためのリレーショナルデータ(動的テーブル)をxmlに変換する

+0

[この回答](http://stackoverflow.com/a/39487565/5089204)Iが提供しますどのように簡単なコール*機能として完全なCSS /ハイパーリンクをサポートしているSELECTからXHTMLテーブルを作成することができます。 – Shnugo

答えて

0

これはうまくいくようです - 私は列名にループを追加し、xmlのクエリ文字列を作成し、sp_executesqlを使用して出力変数にそれを実行しました。 #Tempにいくつかの列を追加してテストし、ヘッダーがテーブルの列と一致することを確認しました。 (sp_send_dbmail呼び出しを追加するために編集 - 私は私自身のSQLインスタンスに電子メールを送信することができました。)で

CREATE TABLE #Temp 
( 
    [Rank] [int], 
    [Player Name] [varchar](128), 
    [Ranking Points] [int], 
    [Country] [varchar](128), 
    [Aces] [int], 
    [Errors] [int], 
    [Sponsor] [varchar](25) 
) 


INSERT INTO #Temp 
SELECT 1,'Rafael Nadal',12390,'Spain',2500,1200,'Adidas' 
UNION ALL 
SELECT 2,'Roger Federer',7965,'Switzerland',3200,900,'Rolex' 
UNION ALL 
SELECT 3,'Novak Djokovic',7880,'Serbia',2200,1100,'Nike' 

SELECT CAST((SELECT [Rank] AS 'td',[Player Name] AS 'td',[Ranking Points] AS 'td',[Country] AS 'td' FROM #Temp ORDER BY Rank 
FOR XML PATH('tr'), ELEMENTS) AS NVARCHAR(MAX)) 


DECLARE @xml NVARCHAR(MAX) 
DECLARE @body NVARCHAR(MAX) 
DECLARE @headers NVARCHAR(MAX) 
DECLARE @cnt INT 
DECLARE @idx INT 

CREATE TABLE #colnames (id int identity(1,1), name varchar(50)) 
INSERT INTO #colnames (name) 
select name as td from tempdb.sys.columns where object_id = 
object_id('tempdb..#Temp') 

SELECT @cnt = COUNT(*) FROM #colnames 
SET @idx = 1 


SELECT @xml = 'SET @retxml = CAST((SELECT ' 
SET @headers = '' 
WHILE @idx < @cnt + 1 
BEGIN 
    SELECT @headers += '<th>' + (SELECT name FROM #colnames WHERE id = @idx) + '</th>' 

    IF @idx > 1 
     SELECT @xml += ','''',' 
    SELECT @xml += '[' + (SELECT name FROM #colnames WHERE id = @idx) + '] AS ''td''' 
    SELECT @idx += 1 
END 
SELECT @xml += ' FROM #Temp ORDER BY Rank 
FOR XML PATH(''tr''), ELEMENTS) AS NVARCHAR(MAX))' 

print @xml 

SET @body ='<html><body><H3>Tennis Rankings Info</H3> 
<table border = 1> 
<tr>' + @headers + '</tr>'  

DECLARE @parm nvarchar(500) 
DECLARE @retxml xml 

SET @parm = '@retxml xml OUTPUT' 

exec sp_executesql @xml, @parm, @retxml OUTPUT 

SET @body = @body + CAST(@retxml AS NVARCHAR(MAX)) +'</table></body></html>' 

EXEC msdb.dbo.sp_send_dbmail 
    @profile_name = 'SQL ALERTING', -- replace with your SQL Database Mail Profile 
    @body = @body, 
    @body_format ='HTML', 
    @recipients = '[email protected]', -- replace with your email address 
    @subject = 'E-mail in Tabular Format' ; 
+0

あなたは一般的に1回の呼び出しで任意のSELECTからXHTMLテーブルを作成する関数を見つけることができます([http://stackoverflow.com/a/39487565/5089204])。 – Shnugo

関連する問題