0

我一直在寻找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 存储在列中,因此'<'或者'>'不是正确的标识符,因为长度可能会根据代码之间的文本或数字而变化。

我的问题是我可以按单词或短语解析文本,例如,<codeblue>Answer B</codeblue>通过搜索关键字来解析出 8000 个字符的列codeblue吗?

4

2 回答 2

1

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);
于 2013-04-19T16:13:06.517 回答
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

于 2013-04-19T16:14:18.120 回答