我想转换像这样的xml字符串:
'<orga_label>ORG1</orga_label><orga_label>ORG2</orga_label><orga_label>ORG3</orga_label>'
进入这样的varchar:
'ORG1, ORG2, ORG3'
在一个查询中的t-sql中。
这可能吗?
答案 0 :(得分: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方法和处理器。
答案 1 :(得分: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
if子串不正确尝试更改数字
答案 2 :(得分: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,'');