0

我有一个 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, or 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

显然,这会选择所有带逗号的值,而不仅仅是带逗号的单个值。

任何帮助都会很棒。

4

1 回答 1

0

您是否考虑过使用上面的解析来构建某种派生列,其中包含来自您的子节点元素的数据,然后使用基于 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) = ','
于 2012-08-24T16:15:52.060 回答