33

入力したxmlドキュメントをテキストとして保存しています。そこで、XMLメソッドを使用できるようにするために、共通テーブル式を使用してデータ型をxmlにCONVERTします。

WITH xoutput AS (
  SELECT CONVERT(xml, t.requestpayload) 'requestpayload'
    FROM TABLE t
   WHERE t.methodid = 1)
SELECT x.requestpayload.query('declare namespace s="http://blah.ca/api";/s:validate-student-request/s:student-id') as studentid
  FROM xoutput x

クエリが機能し、要素が返されます。しかし、私は価値にのみ興味があります:

WITH xoutput AS (
  SELECT CONVERT(xml, t.requestpayload) 'requestpayload'
    FROM TABLE t
   WHERE t.methodid = 1)
SELECT x.requestpayload.value('declare namespace s="http://blah.ca/api";/s:validate-student-request/s:student-id', 'int') as studentid
  FROM xoutput x

これにより、次のエラーが発生します。

'value()'にはシングルトン(または空のシーケンス)が必要で、タイプ'xdt:untypedAtomic*'のオペランドが見つかりました

私がグーグルで検索したところによると、XPATH / XQUERYは括弧内にある必要があるか、「[1]」が必要です。どちらも機能していません。スキーマにはもっと多くのことができると思いますが、xmlにはstudent-id要素が1つだけありますか?

さらに、取得したい要素値が多数あります-メソッド呼び出しごとではなく、名前空間を1回宣言する方法はありますか?

4

3 に答える 3

70

これを使用する必要があります:

SELECT 
        x.requestpayload.value('declare namespace s="http://blah.ca/api";
            (/s:validate-student-request/s:student-id)[1]', 'int') 
    AS
        studentid
    FROM 
        xoutput x

( ... ) XPathを挿入し、を追加し[1]て、そのシーケンスの最初の値を選択する必要があります。

于 2009-08-19T19:37:52.860 に答える
8

私はこれもそうかもしれないと信じています:

SELECT 
   x.requestpayload.query('declare namespace s="http://blah.ca/api";
                           /s:validate-student-request/s:student-id').value('.', 'int') 
  as studentid
FROM xoutput x
于 2011-08-22T18:00:36.490 に答える
3

パフォーマンスに関心のある人のために、これらのアプローチを比較するためにクエリを実行し、「()と[1]を追加する」の最初のオプションは「.query('strFranchise')。value('。'、..。 )」。

同じデータで次々に実行した場合の実行プランの違いは15%から85%でした。したがって、()[1]は5倍以上高速です。実行計画は大きく異なります。

于 2015-05-13T06:37:46.573 に答える