Sql Server 2008粉碎XML

时间:2012-02-03 11:58:46

标签: sql xml tsql xpath xquery

嗨我有这样的XML ......

<Questions>
  <Question1>A</Question1>
  <Question2>B</Question2>
  <Question3>C</Question3>
</Questions>

我想回A,B,C。我见过一些类似的问题,但那些具有相同的重复节点名称。不幸的是,在这个阶段我无法改变它。我玩过AGES的SQL Xpath语法,没有运气。我可以获得整个问题节点,但理想情况下我想要实际数据。多个返回的行也可以。

非常感谢任何帮助。

更新 - 基里尔的答案非常接近,除了我在表中有超过1条记录并且它返回1行内的所有记录数据。如果我能实现一个完美的row / xml文件!通过从该记录输出另一个字段,例如rownum或从文件输出另一条数据,例如摘要名称..

感谢,

阿德里安 !

4 个答案:

答案 0 :(得分:5)

declare @x xml = N'<Questions>
  <Question1>A</Question1>
  <Question2>B</Question2>
  <Question3>C</Question3>
</Questions>
'

SELECT x.value('.','varchar(10)')
FROM @x.nodes('/Questions/*') x(x)

输出

----------
A
B
C

答案 1 :(得分:2)

继续关注马丁的解决方案,并从this获得灵感:

declare @x xml = N'<Questions>
  <Question1>A</Question1>
  <Question2>B</Question2>
  <Question3>C</Question3>
</Questions>
'

DECLARE @Questions VARCHAR(MAX)

SELECT @Questions = COALESCE(@Questions + ', ', '') + Question
FROM (
    SELECT x.value('.','varchar(10)') as Question
    FROM @x.nodes('/Questions/*') x(x)
) as y

SELECT @Questions

输出:

A, B, C

答案 2 :(得分:1)

使用:

declare @x xml ='
<Questions>
  <Question1>A</Question1>
  <Question2>B</Question2>
  <Question3>C</Question3>
</Questions>'

select @x.value('(/*/Question1)[1]', 'nvarchar(max)')
    , @x.value('(/*/Question2)[1]', 'nvarchar(max)')
    , @x.value('(/*/Question3)[1]', 'nvarchar(max)')

输出:

---- ---- ----
A    B    C

答案 3 :(得分:0)

select stuff(
(
    select ',' + x.value('.', 'varchar(10)') [text()]
    from @x.nodes('/*/*') x(x)
    for xml path(''))
, 1, 1, '')

输出:

A,B,C