2013-04-22 21 views
0

我想一個XML字符串轉換是這樣的:轉換倍數XML節點的數據爲VARCHAR

'<orga_label>ORG1</orga_label><orga_label>ORG2</orga_label><orga_label>ORG3</orga_label>' 

爲VARCHAR這樣的:

'ORG1, ORG2, ORG3' 

在T-SQL中的一個查詢。

這可能嗎?

+0

請問這是一個變量還是一列? – gbn 2013-04-22 13:01:25

+0

此外,這是不正確的沒有根節點的XMl – gbn 2013-04-22 13:14:55

回答

1

你可以保持非常簡單,避免XML方法在這裏...

DECLARE @foo xml = '<orga_label>ORG1</orga_label><orga_label>ORG2</orga_label><orga_label>ORG3</orga_label>'; 

SELECT 
    REPLACE(
     REPLACE(
     REPLACE(
      CONVERT(nvarchar(4000), @foo), '</orga_label><orga_label>', ', ' 
     ), 
     '<orga_label>', '' 
    ), 
     '</orga_label>', '' 
    ); 

編輯:這有一個優勢,不是調用XML方法和處理器。

+0

非常感謝,效果很好。:-) – user2307458 2013-04-22 13:23:45

0

你最好在腳本語言中使用xml解析器,比如ruby。

require 'rexml/document' 
xml =REXML::Document.new(File.open"filename/filename.XML") 
xml.each_element('//(your element)') do |sdobi| 
    puts sdobi.attributes["orga_label"] 
end 

如果你真的想用SQL,它是一個有點comeplex:

SELECT SUBSTRING(columnname, LOCATE('<orga_label',columnname) +12, LOCATE('</', tablename)) from tablename 

的,如果子不正確的嘗試更改號碼

+0

LOCATE不是T-SQL函數,我使用CHARINDEX。 結果不好: BPACA 我不能使用其他語言,因爲我使用框架。 :-( – user2307458 2013-04-22 13:22:31

0
declare @xml xml = '<orga_label>ORG1</orga_label><orga_label>ORG2</orga_label><orga_label>ORG3</orga_label>'; 

select stuff((select 
    ',' + s from (
    select 
    a.b.value('(.)[1]', 'varchar(50)') s 
    from @xml.nodes('/orga_label') a(b) 
) t 
for xml path('') 
),1,1,'');