0

テーブルに削除する必要があるTSQL文字列があるため、文字ではなく単語で解析するコードを探しました。XML残念ながら、これらは正確な式に従っていませんXML。つまり、5 ~ 20 個の文字列が存在する可能性があります (この場合は 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>

もちろん、NULL5 ~ 20 個の文字列が存在する可能性があるため、一部の列は になりXMLます。このため、XML を列に格納する必要があるため、CHARINDEX は適切に抽出されません。したがって、コード間のテキスト'<'または'>'数値によって長さが変わる可能性があるため、正しい識別子ではありません。

私の質問は、テキストを単語またはフレーズごとに解析できます<codeblue>Answer B</codeblue>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 に答える