我有一个SQL Server 2008 db列,我们将调用XMLDoc,它包含以下格式的XML:
<XMLDoc xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.xxx.xxx.xxx">
<Node>
<SubNode>
<SubSubNode>Value, Value, Value</SubSubNode>
<IrrelevantNode></IrrelevantNode>
</SubNode>
...
SubSubNode
可容纳0到20多个以逗号分隔的值。单个值不应包含逗号,但不能使用逗号输入。例如,以下SubSubNode
是正确的:
<SubSubNode>Value, Value, Value</SubSubNode>
以下SubSubNode
不正确:
<SubSubNode>Value, </SubSubNode>
我需要用逗号查找并替换单个值的所有实例,以显示为:
<SubSubNode>Value</SubSubNode>
由于SQL不允许ends-with
,starts-with
或matches
,我只能提出以下内容(这只是搜索值,我没有还没有完成替换工作:
with xmlnamespaces(default 'http://schemas.xxx.xxx.xxx')
select [XMLDoc].value('(/XMLDoc/Node/SubNode/SubSubNode)[1]','varchar(2000)')
from XMLDoc
where [XMLDoc].exist('/XMLDoc/Node/SubNode[1] [contains(SubSubNode[1],", ")]')=1
显然,这会用逗号选择所有值,而不只是用逗号选择单个值。
任何帮助都会很棒。
答案 0 :(得分:0)
您是否考虑过使用上面的解析来构建某种包含来自SubNode Element的数据的派生列,然后使用基于sql的解析函数来查找尾随值是逗号的位置?
我只是使用了几个不同的xml文档来显示我的意思...你可以构建一个这样的变体来找到匹配这个模式的行....不是用于查找模式的xquery技术,但是应该工作。
DECLARE @XML XML = '<XMLDoc xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.xxx.xxx.xxx">
<Node>
<SubNode>
<SubSubNode>Value, Value,</SubSubNode>
<IrrelevantNode></IrrelevantNode>
</SubNode>
</Node>
</XMLDoc>'
DECLARE @XML2 XML = '<XMLDoc xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.xxx.xxx.xxx">
<Node>
<SubNode>
<SubSubNode>Value</SubSubNode>
<IrrelevantNode></IrrelevantNode>
</SubNode>
</Node>
</XMLDoc>'
DECLARE @xmlTbl TABLE(XmlDoc VARCHAR(MAX))
;with xmlnamespaces(default 'http://schemas.xxx.xxx.xxx')
Insert Into @xmlTbl
select @XML.value('(/XMLDoc/Node/SubNode/SubSubNode)[1]','varchar(2000)');
;with xmlnamespaces(default 'http://schemas.xxx.xxx.xxx')
Insert Into @xmlTbl
select @XML2.value('(/XMLDoc/Node/SubNode/SubSubNode)[1]','varchar(2000)')
Select *
From @xmlTbl
Where RIGHT(XmlDoc,1) = ','