【问题标题】:TSQL: Parse By Word, Not Specific CharacterTSQL:按单词解析,而不是特定字符
【发布时间】:2013-04-19 15:24:32
【问题描述】:

我一直在寻找 TSQL 代码以按单词而非字符解析,因为我在需要删除的表中有 XML 字符串。不幸的是,它们没有遵循精确的公式,这意味着可以有 5 到 20 个 XML 字符串,即(在这种情况下只有 3 个):

<code>
<codeblue>Answer A</codeblue>
<codered>Blue Twenty</codered>
<codeyellow>WARNING: only push if active</codeyellow>
</code>

有时它们之间是文本或数字,我希望它们中的每一个都存储在列中:

CodeBlue                       |   CodeRed                         | CodeYellow
<codeblue>Answer A</codeblue>  |   <codered>Blue Twenty</codered>  | <codeyellow>WARNING: only push if active</codeyellow>

当然,有些列将是NULL,因为可能有 5 到 20 个 XML 字符串。因此,CHARINDEX 无法正确提取,因为我需要将 XML 存储在列中,因此 '&lt;''&gt;' 不是正确的标识符,因为长度可能会根据代码之间的文本或数字而变化。

我的问题是我可以通过单词或短语来解析文本吗,例如,通过搜索关键字codeblue,从8000个字符的列中解析出&lt;codeblue&gt;Answer B&lt;/codeblue&gt;

【问题讨论】:

    标签: sql sql-server tsql xml-parsing sql-server-2008-r2


    【解决方案1】:

    我认为您需要了解有关 XML 查询方法的更多信息。结合使用查找元素结构的“查询”方法,这相对容易。然后是一个“值”,然后可以在元素中返回一个属性或文本值。

    declare @xml xml = '<code>
    <codeblue>Answer A</codeblue>
    <codered>Blue Twenty</codered>
    <codeyellow>WARNING: only push if active</codeyellow>
    </code>'
    
    select 
        @Xml.query('//code/codeblue').value('.', 'varchar(max)') as codeBlue
    ,   @Xml.query('//code/codered').value('.', 'varchar(max)') as codeRed
    ,   @Xml.query('//code/codeyellow').value('.', 'varchar(max)') as codeYellow
    

    XML 方法参考:http://msdn.microsoft.com/en-us/library/ms190798.aspx

    【讨论】:

      【解决方案2】:

      SQL Server 具有内置的 XQuery 功能,允许您以您所要求的方式查询 XML。这是一个例子:

      create table #t (x xml);
      
      insert #t
      select
      '<code>
      <codeblue>Answer A</codeblue>
      <codebrown>ignore this</codebrown>
      <codered>Blue Twenty</codered>
      <codegreen>ignore this too</codegreen>
      <codeyellow>WARNING: only push if active</codeyellow>
      </code>';
      
      select  Codes.n.value('codeblue[1]','varchar(max)') As CodeBlue
              , Codes.n.value('codered[1]','varchar(max)') As CodeRed
              , Codes.n.value('codeyellow[1]','varchar(max)') As CodeYellow
      from    #t t
              cross apply t.x.nodes('/code') as Codes(n);
      

      【讨论】:

        猜你喜欢
        • 2019-02-13
        • 2011-01-19
        • 2010-12-12
        • 1970-01-01
        • 2017-07-11
        • 1970-01-01
        • 2016-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多