0

我想像这样转换一个 xml 字符串:

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

变成这样的varchar:

'ORG1, ORG2, ORG3'

在一个查询中的 t-sql 中。

那可能吗?

4

3 回答 3

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 方法和处理器的优点。

于 2013-04-22T13:22:16.520 回答
0

最好在 ruby​​ 之类的脚本语言中使用 xml 解析器。

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,那就有点复杂了:

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

如果子字符串不正确尝试更改数字

于 2013-04-22T13:05:25.887 回答
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,'');
于 2013-04-22T13:34:01.823 回答