我想將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>
我想將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>
我認爲你需要像下面的格式
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" />
這是我的第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>
我把這個作爲第二個答案,因爲這種方法是如此完全不同:
首先我用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>
最令人印象深刻。用更少的代碼和更快的速度覆蓋OP的需求...快23%。不知道它是如何工作的 –
我不想提列的名稱。因爲桌子可以根據我的需要而變化。我想列名和字段值需要自動填充在SQL查詢 – Arun
@Arun檢查我的更新 – Shnugo