私は、かなりの時間がかかる「ブラックボックス」プロセスの代替ソリューションを調査することを任されましたが、その中で変更または改善することはできません。ネストされた要素を含むSQLテーブル内のXML
私がしようとしているのは、テキストフィールド(変換するためにCASTを使用)として現在保持されているテーブル内のXMLから情報を抽出することです。複数の行があり、XMLには属性を含むいくつかのネストされた要素が含まれています。次のように1行分の格納されたXMLの
一例である:私は抽出するために必要なもの
<offerContext weightExpr="90">
<filter label="Description of XML held here">
<where displayFilter="Second description of XML held here" filterName="backGroundFilterFrm" id="13706004488">
<condition boolOperator="AND" compositeKey="" dependkey="FK_Rcp_Brand" enabledIf="" expr="@BrandId = 1" internalId="-1548698833" />
<condition boolOperator="AND" compositeKey="FK_Rcp_Brand" dependkey="" expr="FK_Rcp_Brand = '1'" internalId="1370600592" />
<condition boolOperator="AND" compositeKey="" dependkey="" expr="proposition" internalId="1370600625" setOperator="EXISTS">
<condition boolOperator="AND" compositeKey="" dependkey="" expr="@status = 3" internalId="1370600632" />
<condition boolOperator="AND" compositeKey="" dependkey="" expr="[offer/@name] = 'Spend20get5Off'" internalId="1370600644" />
<condition compositeKey="" dependkey="" expr="[offerSpace/@channel] = 0" internalId="1370600655" />
</condition>
<condition boolOperator="AND" compositeKey="" dependkey="" enabledIf="" expr="proposition" internalId="1372382776" setOperator="NOT EXISTS">
<condition boolOperator="AND" compositeKey="" dependkey="" enabledIf="" expr="[offer/@name] = 'Spend20get5Off'" internalId="1372382779" />
<condition boolOperator="AND" compositeKey="" dependkey="" enabledIf="" expr="@eventDate >= DaysAgo(21)" internalId="1372382782" />
<condition boolOperator="AND" compositeKey="" dependkey="" enabledIf="" expr="[offerSpace/@channel] = 0" internalId="1372382786" />
</condition>
</where>
<humanCond>Query: Description of XML held here</humanCond>
</filter>
<extension useBuildPropositionsScript="false" />
</offerContext>
はofferContext要素からweightexprあります。これと並んで、各条件要素からbooloperator、compositekey、dependkey、expr、internalIdが必要です。子要素が親要素にリンクされるようにこれらを抽出する必要があります。これが私がいくつかの問題を抱えているところです。私は、両方の要素を1つの行にプルする次のようなことがありますが、後でいくつかの操作が必要になります(問題はありませんが、これを行うための良い方法があることを知りたがっています)。
私がこれまででてきたコード:私が権利を持っていることが重要である理由
;WITH contexts AS
(
SELECT a.iOfferId, a.iOfferContextId, a.mdata, CONVERT(xml,a.mdata) AS XMLmData
FROM NmsOfferContext a
)
SELECT
iOfferId
,iOfferContextId
,p2.value('(@weightExpr)[1]', 'nvarchar(max)') AS dweight
,p2.value('(@boolOperator)[1]', 'nvarchar(max)') AS boolOperator2
,p2.value('(@dependKey)[1]', 'nvarchar(max)') AS dependKey2
,p2.value('(@expr)[1]', 'nvarchar(max)') AS expr2
,p2.value('(@setOperator)[1]', 'nvarchar(max)') AS setoperator2
,p2.value('(@internalId)[1]', 'nvarchar(max)') AS internalID2
,p3.value('(@boolOperator)[1]', 'nvarchar(max)') AS boolOperator3
,p3.value('(@dependKey)[1]', 'nvarchar(max)') AS dependKey3
,p3.value('(@expr)[1]', 'nvarchar(max)') AS expr3
,p3.value('(@setOperator)[1]', 'nvarchar(max)') AS setoperator3
,p3.value('(@internalId)[1]', 'nvarchar(max)') AS internalID3
FROM contexts
CROSS APPLY XMLmData.nodes('/offerContext/*/*/condition') t(p2)
CROSS APPLY XMLmData.nodes('/offerContext/*/*/condition/condition') t2(p3)
ORDER BY iOfferContextId,
p2.value('(@internalId)[1]', 'nvarchar(max)'),
p3.value('(@internalId)[1]', 'nvarchar(max)')
最終的に私は、したがって、exprの値に基づいて、SQLクエリを構築するために必要とWHERE句のためbooloperatorを使用して(私はinternalId属性でも実現できると信じている)要素の順序ですが、親と子の関係を維持することは私が助けが必要なところです。
私は正しい軌道に乗っているなら、どんな助けもありがたいと思います。何か明確な説明が必要な場合は、お気軽にお問い合わせください。
ありがとうございます。
あなたの例では、条件の1子レベルを示しています...もっとあるかもしれない? – Shnugo
私の知る限り、2つのレベルしかありません。私は確かに今のところこれらのレベルに限定しています。 –