2009-08-19 12 views
31

私は、入力されたXML文書をテキストとして保存しています。だから私は、XMLメソッドを使用できるようにするために、共通テーブル式を使用してXMLにデータ型を変換する使用します。XMLクエリー()が動作します。値()にはシングルトンが必要ですxdt:untypedAtomic

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 

は、これは私に次のエラーを与える:私はGoogleで検索してきた何

'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'

は、XPath/XQueryは括弧内および/またはにする必要があると述べていますneed "[1]" - どちらもうまくいきませんでした。 XMLにはstudent-id要素が1つしかありませんが、スキーマではそれ以上のことが可能ですか?

さらに、検索したい要素の値が多数あります。メソッド呼び出しではなく名前空間を宣言する方法がありますか?

答えて

62

あなたはこれを使用する必要があります。

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]を追加する必要があります。私は、これはまたやるかもしれないと考えてい

7

:パフォーマンスに興味のある人のための

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 
3

を私はこれらのアプローチとして最初のオプションを比較するために、クエリを実行した「()と追加[1]」よりもはるかに高速でした".query( 'strFranchise')。value( '。'、...)"。

実行計画の違いは、同じデータに対して次々に実行すると15%~85%でした。だから()[1]は5倍以上高速です!実行計画は大きく異なります。

+0

私が理解しているように、 '[1]'は最初の結果のみを返し、 '.value( '。''はすべての結果を返します。 –

関連する問題