クエリ関数と値関数を使用して、xml データである列を持つテーブルをクエリしようとしています。通常の文字列リテラルを使用する場合は問題ありませんが、それをストアド プロシージャに入れて変数を使用しようとすると機能しません。
正しいデータ型を使用していないと思いますが、検索を行った後、クエリ関数が必要とするデータ型がわかりません。
例: テーブルの内容
| Id | xmldata |
| 1 | <data><node>value</node></data> |
今、選択クエリを使用して
select id
from table
where xmldata.query('/data/node').value('.', 'VARCHAR(50)') = 'value'
必要なデータを取得します。しかし、これをストアドプロシージャで使用し、パラメーターを使用して
、エラーが発生@xpath varchar(100)
したときにそれをクエリメソッドに渡すとxmldata.query(@xpath)
The argument 1 of the xml data type method "query" must be a string literal.
varchar(100) は正しくないと思いますが、MSSQL を満足させるにはどのデータ型を使用できますか?
更新:わかりました。どうやら「そのように」クエリメソッドにパラメーターを渡すことはできませんが、ローカル名と組み合わせて sql:variable を使用して、その一部を処理することはできます。したがって、たとえば、これは機能します
declare @xpath VarChar(100)
set @xpath='node'
select objectData.query('/data/*[local-name() = sql:variable("@xpath")]')
.value('.', 'varchar(100)') as xmldata
from table
列 xmldata で値が選択されます。しかし (!) ルート ノードがクエリ関数の最初の値である必要があります。以下は動作しません
declare @xpath VarChar(100)
set @xpath='/data/node'
select objectData.query('*[local-name() = sql:variable("@xpath")]')
.value('.', 'varchar(100)') as xmldata
from table
クエリ パスが変数まで「上に移動」されていることに注意してください。私は私の調査を続けます..