TSQL:按字分析,不是特定字符

时间:2013-04-19 15:24:33

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

我已经查找了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吗?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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