1

私は次のXMLを使用しています

<AEDControl ControlGU="17fed98c-8128-4c6b-9b50-3dbe73889b9d" 
            ControlLabel="Posting Status" 
            TypeGU="6b4d08b1-6340-450c-beae-517b7d84e717" 
            ControlDescription="">
  <Elements>
    <Element ElementGU="2da346d1-2e05-4aa3-9bae-5aa9b3b75d5c" 
             Label="Active" 
             IsDefault="false"/>
    <Element ElementGU="fa8966fc-c796-4482-9ee1-f619910dc86e" 
             Label="Closed" 
             IsDefault="false"/>
    <Element ElementGU="d701a7d7-c3bd-496b-8d4b-b854a6937c3a" 
             Label="Filled" 
             IsDefault="false"/>
    <Element ElementGU="75af1941-f14f-4b7e-9f1e-5b6852c4a4f7" 
             Label="New" 
             IsDefault="false"/>
    <Element ElementGU="aa54e387-608e-4758-b4f2-c1dc485a5576" 
             Label="Pending" 
             IsDefault="true"/>
    <Element ElementGU="210aef5c-e4cf-4987-815f-0e4274b45e08" 
             Label="Scratch" 
             IsDefault="false"/>
 </Elements>

特定のElementGUを持つ要素のラベルをプルバックするために、ストアドプロシージャからクエリを実行しようとしています

私のストアドプロシージャは次のようになります。

SELECT 
   CAST(CONTROL_XML.query('data(/AEDControl/Elements/Element/@Label)') as varchar(100)) as ControlLabel 
FROM 
   Control
WHERE 
   CONTROL_XML.exist('/AEDControl/Elements/Element[@ElementGU = sql:variable("@SelectedValueGU")]') = 1

ここElementGUで、は渡されたuniqueidentifierフィールドです。

私はこれで運がないようです。XQueryではこの種の動的クエリを実行できないことを読みましたが、同時に、slq:variable()呼び出しはXQueryの一部であるため、これをクリアできる人はいますか?

私はまだXQueryの面でかなり新しいです。

4

2 に答える 2

1

これには少し異なるアプローチが必要です。ノードのリストがあるので、<Element>ノードのリストを作成してから、そのリストから適切なノードを選択することをお勧めします。次のようになります。

SELECT 
    AED.Element.value('(@Label)[1]', 'varchar(100)') as ControlLabel 
FROM
    Control
CROSS APPLY
    Control_XML.nodes('/AEDControl/Elements/Element') AS AED(Element)
WHERE
AED.Element.value('(@ElementGU)[1]', 'uniqueidentifier') = @SelectedValueGU

ベーステーブルからどのように選択するか(WHERE句などを使用するかどうか)はわかりませんが、CROSS APPLYは基本的にXMLフィールドを取得AED.Elementし、で指定されたノードから呼び出される「疑似テーブル」を作成します。 XPath式、およびそれらをベーステーブルに相互適用します。したがって、これらの行の各エントリControlと各<Element>ノードに対して、1行のデータを取得します。

その行で、渡した値に値が対応する行を選択できるよう@ElementGUになりました。この場合、XMLノードの場合は、@Label属性の値を選択します。

于 2010-10-26T21:16:44.850 に答える
0

sql:variable()このXPath(拡張機能付き)は機能するはずだと思います:

/AEDControl
 /Elements
  /Element[@ElementGU = sql:variable("@SelectedValueGU")]
   /@Label
于 2010-10-26T21:22:50.783 に答える