2

IN 式を使用して xml 列をクエリしようとしています。このようなクエリを実行するネイティブ XQuery の方法が見つからないため、次の 2 つの回避策を試しました。

  1. 次のように、OR の連結として IN クエリを実装します。

     WHERE Data.exist('/Document/ParentKTMNode[text() = sql:variable("@Param1368320145") or 
     text() = sql:variable("@Param2043685301") or ...
    
  2. 次のように、String fn:contains(...) メソッドを使用して IN クエリを実装します。

    WHERE Data.exist('/Document/Field2[fn:contains(sql:variable("@Param1412022317"), .)]') = 1
    

指定されたパラメーターは、「|」で区切られた値を持つ (長い) 文字列です。

問題は、バージョン 1. が約 50 を超える引数に対して機能しないことです。サーバーがメモリ不足の例外をスローします。バージョン 2. は動作しますが、非常に遅いです。

3.アイデアはありますか?問題をより完全に表現するには: SQL ネイティブ型の値のリストが与えられた場合、xml 列が xml の特定のフィールドで指定された値の 1 つを持つすべての行を選択します。

4

1 に答える 1

1

すべてのパラメーターをテーブルに挿入し、sql:column句を使用してクエリを実行してみてください。

SELECT Mytable.Column FROM MyTable
CROSS JOIN (SELECT '@Param1' T UNION ALL SELECT '@Param2') B
WHERE Data.exist('/Document/ParentKTMNode[text() = sql:column("T") 
于 2011-09-23T09:44:27.567 に答える