ビューで 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 値メソッドは定数文字列を要求しているようです。とにかくこのあたりはありますか?