2010-11-12 25 views
1

得到了一些基本的XML作爲SQL 2005的一個記錄/行中的XML數據類型看起來像這樣XQuery和T-SQL來提取數據

<doc> 
    <level1> 

    <level2> 
     <name>James</name> 
     <age>12</age> 
    </level2> 

    <level2> 
     <name>John</name> 
     <age>23</age> 
    </level2> 

    </level1> 
</doc> 

當我執行一些基本的T_SQL

SELECT TOP 1 
DocumentXML.query('data(//doc/name)'), 
DocumentXML.query('data(//doc/age)') 
FROM [DBNAME].[dbo].[TBLNAME] 

我得到

ID | Name  | Age 
---------------------- 
1 | JamesJohn | 1223 

如何重新寫的T-SQL,使其顯示爲

ID | Name | Age 
-------------------- 
1 | James | 12 
2 | John | 23 

回答

5

你的例子不適合我;第二級2以</level2>打開。並且//doc/name不存在;可能是//doc/level1/level2/name

下面是如何從XML檢索行集的例子:

declare @t table (id int identity, doc xml) 
insert @t (doc) values (
    '<doc> 
     <level1> 

     <level2> 
      <name>James</name> 
      <age>12</age> 
     </level2> 

     <level2> 
      <name>John</name> 
      <age>23</age> 
     </level2> 

     </level1> 
    </doc>') 

SELECT x.a.value('(name)[1]','varchar(50)') as col1 
,  x.a.value('(age)[1]','varchar(50)') as col2 
FROM @t t 
cross apply 
     t.doc.nodes('//level2') x(a) 

此打印:

col1  col2 
James 12 
John  23 
+0

感謝 - 但我的XML是行內存儲爲XML數據類型,怎麼會這然後工作? – 2010-11-15 08:14:24

+0

@Janusz Jasinski:您可以使用'cross apply'來執行每行的'nodes'操作。添加示例以回答。 – Andomar 2010-11-15 10:43:41