XML SQL查找和替换

时间:2012-08-24 15:52:47

标签: sql xml sql-server-2008

我有一个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-withstarts-withmatches,我只能提出以下内容(这只是搜索值,我没有还没有完成替换工作:

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

显然,这会用逗号选择所有值,而不只是用逗号选择单个值。

任何帮助都会很棒。

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) = ','