2013-03-15 64 views
1

我對數據庫電子郵件有以下T-Sql。使用xquery轉換爲html?

-- create proc TableToHtml @table varchar(max) as 
declare @table varchar(max) = '(select 1 a, ''one'' b union all select 2, ''two'') t ' 
declare @sql varchar(max) = ' 
    declare @xml xml = (
     select * from ' + @table + ' 
     for xml path(''tr''), root(''table'') 
    ); 
    select @xml' 
declare @tmp table (x xml) 
insert into @tmp exec(@sql) 
declare @x xml = (select x from @tmp) 
select @x 

,並返回

<table> 
    <tr> 
    <a>1</a> 
    <b>one</b> 
    </tr> 
    <tr> 
    <a>2</a> 
    <b>two</b> 
    </tr> 
</table> 

是否有可能寫的XQuery讓它返回下面的HTML?

<table> 
    <tr> 
    <th>a</th> 
    <th>b</th> 
    </tr> 
    <tr> 
    <td>1</td> 
    <td>one</td> 
    </tr> 
    <tr> 
    <td>2</td> 
    <td>two</td> 
    </tr> 
</table> 

回答

2

我想出了一個更少的黑客。唯一的問題是,如果值爲空,它將創建<td />而不是<td></td>。當電子郵件發送到一些舊的Outlook客戶端時,會導致一些佈局問題。

declare @table varchar(max) = '(select 1 a, ''one'' b union all select 2, ''two'') t ' 
declare @sql varchar(max) = ' 
    declare @xml xml = (
     select * from ' + @table + ' 
     for xml path(''tr''), root(''table'') 
    ); 
    select @xml' 
declare @tmp table (x xml) 
insert into @tmp exec(@sql) 
declare @x xml = (select x from @tmp) 
select @x.query('<body> 
<table> 
    <tr> 
    {for $c in /table/tr[1]/* return element th { local-name($c) } } 
    </tr> 
    { 
    for $r in /table/* 
    return element tr { for $c in $r/* return element td { data($c) } } 
    } 
</table> 
</body>') 
0

主要黑客警報!

有可能是一個更優雅的方式來做到這一點,但這裏是快速黑客:

declare @xml xml = (
    select * from (
     select 'a' + '</th><th>' + 'b' as th, null as td 
     union all 
     select null, '1' + '</td><td>' + 'one'  
     union all 
     select null, '2' + '</td><td>' + 'two'  
    ) t 
    for xml path('tr'), root('table') 
); 
select cast(replace(replace(cast(@xml as varchar(max)), '&lt;/th&gt;&lt;th&gt;', '</th><th>'), '&lt;/td&gt;&lt;td&gt;', '</td><td>') as xml) 

輸出:

<table> 
    <tr> 
    <th>a</th> 
    <th>b</th> 
    </tr> 
    <tr> 
    <td>1</td> 
    <td>one</td> 
    </tr> 
    <tr> 
    <td>2</td> 
    <td>two</td> 
    </tr> 
</table> 

哈克列表:

  • 使用空值g等th和td在同一個「列」
  • 明確添加你的頭值a和b
  • 串聯列值,並明確提出的結束和開始標籤中間
  • 將XML轉換爲varchar
  • 更換消毒用尖括號版本這些標籤的版本
  • 轉換回XML

這在很大程度上大概可以重構使用變量,或許可以從你的輸入/數據收集。

注:

一般來說,你應該讓你的演示文稿層爲您創建的HTML。你可以在你的數據庫中創建一個通用函數來從表格中創建html,但已經有很多優秀的表示類,控件等被設計用來完成這個任務。您的應用程序幾乎總是可以比您的數據庫縮放更好