2017-04-13 73 views
1

我想將sql表記錄轉換爲下面的xml格式。你能否提出你的建議。從SQL Server表中構建xml元素

SQL Server表:

id name 
------------- 
1 Arun 
2 Raghavan 

我想形成從上表中的XML元素就像一個SQL查詢

<row> 
    <Field Name="Customer.id" Value="id"> 
    <Field Name="Customer.name" Value="arun"> 
</row> 

回答

1

我認爲你需要像下面的格式

SELECT 'Customer.id' AS [@Name] 
     ,id AS [@Value] 
FROM SomeTable 
FOR XML PATH('Field'),ROOT('row'); 

如果你真的需要這樣的表和列的名字像你的例子中連接,沒有隨和。在這種情況下,John Cappelletti's answer太棒了!

但檢查這些外的開箱辦法(AUTO會生成表的名稱作爲元素的name):

CREATE TABLE SomeTable (id int,name varchar(50)) 
INSERT INTO SomeTable VALUES 
(1,'Arun') 
,(2,'Raghavan'); 

SELECT * FROM SomeTable FOR XML AUTO; 
SELECT * FROM SomeTable FOR XML RAW; 

- 結果爲第一

<SomeTable id="1" name="Arun" /> 
<SomeTable id="2" name="Raghavan" /> 

- 第二個結果

<row id="1" name="Arun" /> 
<row id="2" name="Raghavan" /> 
+0

我不想提列的名稱。因爲桌子可以根據我的需要而變化。我想列名和字段值需要自動填充在SQL查詢 – Arun

+0

@Arun檢查我的更新 – Shnugo

1

這是我的第th上墨需要我。

這是一個動態的unpivot,然後轉換回合併的XML對象。

我加了交叉申請C來保存表名,但這可以是一個變量。

Declare @YourTable table (id int,name varchar(50)) 
Insert into @YourTable values 
(1,'Arun'), 
(2,'Raghavan') 

Select D.* 
From @YourTable A 
Cross Apply (Select XMLData=cast((Select A.* for XML Raw) as xml)) B 
Cross Apply (Select TableName='Customer') C 
Cross Apply (
       Select row = (
           Select [@Name] = C.TableName+'.'+attr.value('local-name(.)','varchar(100)') 
             ,[@Value] = attr.value('.','varchar(max)') 
           From B.XMLData.nodes('/row') as A(r) 
           Cross Apply A.r.nodes('./@*') AS B(attr) 
           For XML Path('Field'),Type 
          ) 
      ) D 
For XML Path(''),Type 

返回

<row> 
    <Field Name="Customer.id" Value="1" /> 
    <Field Name="Customer.name" Value="Arun" /> 
</row> 
<row> 
    <Field Name="Customer.id" Value="2" /> 
    <Field Name="Customer.name" Value="Raghavan" /> 
</row> 
+0

好,我更新了我的答案指向FOR XML AUTO ...這種方法是一個很好的解決方案,但相當駭人聽聞:-D – Shnugo

+0

@Shnugo被稱爲更糟...今天上午:) –

+0

嗨@約翰,我剛剛放了另一個答案。想想,你會喜歡它:-D – Shnugo

1

我把這個作爲第二個答案,因爲這種方法是如此完全不同:

首先我用SELECT ... FOR XML AUTO。這將創建簡單的標籤,其中表格的名稱是元素的名稱,所有字段都以屬性的形式生成。

從此我繼續使用FLWOR XQuery。首先,我讀取所有節點,然後讀取節點內的所有屬性。

CREATE TABLE SomeTable (id int,name varchar(50)) 
INSERT INTO SomeTable VALUES 
(1,'Arun') 
,(2,'Raghavan'); 

--The查詢(您可以將代替 「SomeTable」 任何表的,視圖的或TVF的名字)

SELECT 
(
SELECT * FROM SomeTable FOR XML AUTO,TYPE --<-- Here is the simple SELECT 
).query(' 
     for $nd in /* 
     return <row> 
     { 
      for $attr in $nd/@* 
      return <Field Name="{concat(local-name($nd),".",local-name($attr))}" Value="{$attr}"/> 
     } 
     </row>'); 
GO 
--Clean up (careful with real data!) 
--DROP TABLE SomeTable; 
GO 

結果

:根據需要XML這是重新生成
<row> 
    <Field Name="SomeTable.id" Value="1" /> 
    <Field Name="SomeTable.name" Value="Arun" /> 
</row> 
<row> 
    <Field Name="SomeTable.id" Value="2" /> 
    <Field Name="SomeTable.name" Value="Raghavan" /> 
</row> 
+0

最令人印象深刻。用更少的代碼和更快的速度覆蓋OP的需求...快23%。不知道它是如何工作的 –