簡體   English   中英

Sql Server表到具有多個子節點的XML

[英]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)。 從那里,您可以使用UNPIVOTFOR 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM