0

ビューで xml 列を細断し、その列から情報を抽出しています。私のビューは現在、local-name((/*)[1] で大規模な CASE ステートメントを実行して、XML のルート ノードの名前を取得しています。次に、xml にドリルダウンして、CASE に基づいて特定の値を取得しています。 .

例えば

CASE xdata.value('local-name((/*)[1])', 'sysname')
WHEN 'Person' THEN xdata.value('(/*/PersonGuid/Personnel/@UserName)[1]', 'varchar(50)')
WHEN 'Component' THEN xdata.value('(/*/ComponentGuid/Component/@Number)[1]', 'varchar(50)')
END

このケース ステートメントは非常に大きく、扱いにくいものです。

私がやろうとしたことは、CASE で評価しているアイテムを含む CTE に辞書を作成し、次に XML 値メソッドに提供したいパラメーター値を作成することです。たとえば、上記の例の場合、CTE ディクショナリには次のものが含まれます (そして、CTE はメインの外部クエリに正しく結合されます)。

;WITH CTE_Selector (TableName, Selector) AS
(
SELECT 'Person', '(/*/PersonGuid/Personnel/@UserName)[1]'
UNION SELECT 'Component' ,'(/*/ComponentGuid/Component/@Number)[1]'
)

case ステートメントを回避するためにビューで CTE を使用しようとすると、次のようになります。

, xdata.value(CTE_Selector.Selector, 'varchar(50)')

次のエラーが表示されます: XML データ型メソッド「クエリ」の引数 1 は、文字列リテラルでなければなりません。

一言で言えば、XML 値メソッドは定数文字列を要求しているようです。とにかくこのあたりはありますか?

4

1 に答える 1

1

XQuery 式の代わりに列または変数を使用することはできません。XQuery 式で列または変数を使用できますが、この状況ではあまり役に立たないと思います。

SQL:列()
SQL:変数()

への呼び出しは 1 回だけ使用できます。value()このような。

xdata.value('(
              /Person/PersonGuid/Personnel/@UserName,
              /Component/ComponentGuid/Component/@Number
             )[1]', 'varchar(50)')
于 2012-05-24T05:40:50.447 に答える