2012-03-07 63 views
1

有沒有辦法從「select * from ANY_TABLE」查詢中獲取此XML?來自選擇查詢的通用XML

<root> 
    <row> 
     <column name="id" value="321"> 
     <column name="name" value="Book"> 
    </row> 
    <row> 
     <column name="id" value="654"> 
     <column name="name" value="Pen"> 
    </row> 
</root> 

回答

2

以下是獲取所需結果的方法。

declare @T table(id int, name varchar(20)) 

insert into @T values(321, 'Book') 
insert into @T values(654, 'Pen') 

select (
     select 'id' as '@name', 
       T.id as '@value' 
     for xml path('column'), type 
     ), 
     (
     select 'name' as '@name', 
       T.name as '@value' 
     for xml path('column'), type 
     ) 
from @T as T 
for xml path('row'), root('root') 

如果你想這對使用select *你可以用這個代替任何工作表中。 只需將@T替換爲您的表名即可。注意:這隻有在列名是有效的XML元素名稱時纔有效。

select 
    (
    select T3.N.value('local-name(.)', 'sysname') as '@name', 
      T3.N.value('.', 'nvarchar(max)') as '@value' 
    from (
      select T1.* 
      for xml path(''), type 
     ) T2(N) 
     cross apply T2.N.nodes('*') as T3(N)  
    for xml path('column'), root('row'), type 
)   
from @T as T1 
for xml path(''), root('root') 
2

如果您需要轉換FOR XML所獲得的結果,可以考慮使用XSLT。

+0

請問您能指點幾個例子嗎? – Cherven 2012-03-07 16:53:40

+0

這是一個相當大的話題!您可以從http://msdn.microsoft.com/en-us/library/ms171950.aspx開始 – 2012-03-07 17:04:14

+0

看起來像SQL服務器沒有XmlTransform函數,我不能在這裏使用CLR。 – Cherven 2012-03-07 17:17:20

2

試試這個:

Declare @Temp Table(Id Int, Name VarChar(20)) 

Insert Into @Temp Values(321, 'Book') 
Insert Into @Temp Values(654, 'Pen') 

Select (
      Select 'id' as '@name', 
        id as '@value' 
      From @Temp As B 
      Where A.Id = B.Id 
      FOR XML Path('column'), Type 
     ),  
     (
      Select 'name' as '@name', 
        Name as '@value' 
      From @Temp As B 
      Where A.Id = B.Id 
      FOR XML Path('column'), Type 
) 
From @Temp As A 
FOR XML path('row'), Root('root') 

注意到,此代碼使用一個臨時表變量,所以我可以笨蛋了一些數據。將其修改爲使用實際表格應該相對容易。

+0

謝謝,它的作品,但不適合我的情況。它唯一的問題是它知道'Id'和'Name'列。我想找到一種方法來將select *從ANY_TABLE轉換爲該格式。 – Cherven 2012-03-07 17:56:55

+0

在你的子查詢中沒有必要使用'from @ Temp'。您可以使用別名「A」直接查詢字段。您將避免兩次表掃描。 – 2012-03-07 17:57:45