【问题标题】:XML SQL find and replaceXML SQL 查找和替换
【发布时间】:2012-08-24 15:52:47
【问题描述】:

我有一个 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 是正确的:

&lt;SubSubNode&gt;Value, Value, Value&lt;/SubSubNode&gt;

以下SubSubNode不正确:

&lt;SubSubNode&gt;Value, &lt;/SubSubNode&gt;

我需要查找并用逗号替换单个值的所有实例以显示为:

&lt;SubSubNode&gt;Value&lt;/SubSubNode&gt;

由于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

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

任何帮助都会很棒。

【问题讨论】:

    标签: sql xml sql-server-2008


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-30
      • 2023-03-26
      • 1970-01-01
      • 2016-03-27
      • 2016-10-31
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      相关资源
      最近更新 更多