[英]Sql Server table to XML with multiple child nodes
我有下表
name | age | misc
------------------
david | 20 | foo
john | 30 | bar
我想將其轉換為以下XML:
<doc>
<field name="name" val="david" />
<field name="age" val="20" />
<field name="misc" val="foo" />
</doc>
<doc>
<field name="name" val="john" />
<field name="age" val="30" />
<field name="misc" val="bar" />
</doc>
我有以下工作單列,但如果我嘗試為另一個field
節點添加第二列我得到錯誤:
Msg 9303, Level 16, State 1, Line 25
XQuery [query()]: Syntax error near 'name', expected '}'.
這是我嘗試做的一個示例,並准備在SQL Server Management Studio中運行。 我找不到很多關於語法的文檔,而且很遺憾。
任何幫助表示贊賞!
declare @MyData table (name varchar(200), age varchar(200), misc varchar(200))
insert into @MyData values('david', '20', 'foo')
insert into @MyData values('john', '30', 'bar')
/*This one works fine*/
SELECT (select * from @MyData as MyData for xml auto, type).query
(
' for $d in /MyData
return
<doc>{
<field name="name" val="{data($d/@name)}" />
}</doc>'
)
/*This one is what I want*/
SELECT (select * from @MyData as MyData for xml auto, type).query
(
' for $d in /MyData
return
<doc>{
<field name="name" val="{data($d/@name)}" />
<field name="age" val="{data($d/@age)}" />
<field name="misc" val="{data($d/@misc)}" />
}</doc>'
)
這個怎么樣..
select
(select 'name' as 'field/@name', a.name as 'field/@val' for xml path(''), type),
(select 'age' as 'field/@name', a.age as 'field/@val' for xml path(''), type),
(select 'misc' as 'field/@name', a.misc as 'field/@val' for xml path(''), type)
from
MyData a for xml path('doc')
對於你的XQuery版本試試這個:(我剛剛刪除了花括號)可以嗎?
SELECT (select * from @MyData as MyData for xml auto, type).query
(
' for $d in /MyData
return
<doc>
<field name="name" val="{data($d/@name)}" />
<field name="age" val="{data($d/@age)}" />
<field name="misc" val="{data($d/@misc)}" />
</doc>'
)
您實際上是在嘗試為不透明的數據獲取XML。 因此,首先獲取一個不是字段的唯一行標識符(我將使用CTE和row_number)。 從那里,您可以使用UNPIVOT和FOR XML EXPLICIT :
;with data as (
select name, age, misc,
row_number() over(order by name) as 'row'
from @MyData
)
select 1 as tag,
null as parent,
row as [doc!1!row!hide],
null as [field!2!name],
null as [field!2!val]
from data
UNION
select 2 as tag,
1 as parent,
row as [doc!1!row!hide],
fieldName as [field!2!name],
val as [field!2!val]
from data d
UNPIVOT(val for fieldName in (name, age, misc)) up
order by row, tag
FOR XML EXPLICIT, ROOT('root')
ROOT('root')
是添加一個簡單的根元素,並且是所請求的xml格式的補充,但我認為它可能有用。
UPDATE
在仔細查看查詢執行計划后,最好只創建格式化文本然后轉換為xml:
select cast('<field name="name" val="'+name+'" />'+
'<field name="age" val="'+age+'" />'+
'<field name="misc" val="'+misc+'" />'
as xml)
from @MyData
for xml path('doc')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.