2012-02-03 72 views
3

您好我有一些這樣的XML ...SQL Server 2008中的XML碎紙

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

我想回A,B,C。我已經看到一些類似的問題,但那些具有相同的重複節點名稱。不幸的是,在這個階段我不能改變它。我玩過AGES的SQL Xpath語法,但沒有運氣。我可以得到整個問題節點,但理想情況下我想要實際數據。多個返回的行也可以。

任何幫助將不勝感激。

更新 - Kirill的答案非常接近,除了我在表中有超過1條記錄並且它返回了1行內的所有記錄數據。如果我可以實現一個完美的行/ XML文件!通過輸出該記錄中的另一個字段,例如rownum或輸出來自文件的另一段數據,例如摘要名稱..

感謝,

阿德里安 !

回答

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 
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 
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 
0
select stuff(
(
    select ',' + x.value('.', 'varchar(10)') [text()] 
    from @x.nodes('/*/*') x(x) 
    for xml path('')) 
, 1, 1, '') 

輸出:

A,B,C 
+0

這是偉大的,但我使用一個表,這個代碼返回1行中的所有記錄數據。我需要每行中的每個XML文件數據。 – 2012-02-03 14:57:57

+0

@AdrianTurner,提供一些示例。 – 2012-02-03 17:53:59