式コンテキストとクエリの評価 (XQuery)

式のコンテキストは、式の分析と評価を行うために使用される情報です。次に、XQuery を評価する際の 2 つのフェーズを示します。

  • 静的コンテキスト – このフェーズではクエリがコンパイルされます。クエリの静的分析中に、使用できる情報に基づいて、エラーが発生する場合があります。

  • 動的コンテキスト – このフェースではクエリが実行されます。クエリをコンパイル中のエラーなどの静的エラーが含まれない場合でも、クエリの実行中にエラーが返ることがあります。

静的コンテキスト

静的コンテキストの初期化とは、式の静的分析向けに、すべての情報をまとめるプロセスのことです。静的コンテキストの初期化の一環として、次のことが行われます。

  • 境界空白文字のポリシーが分離に設定されます。したがって、クエリ内の any element コンストラクタや attribute コンストラクタでは境界空白文字が保持されません。次に例を示します。

    declare @x xml
    set @x=''
    select @x.query('<a>  {"Hello"}  </a>,
    
        <b> {"Hello2"}  </b>')
    

    XQuery 式の解析時に境界空白文字が取り除かれるので、このクエリは次の結果を返します。

    <a>Hello</a><b>Hello2</b>
    
  • 次のプレフィックスと名前空間のバインドが初期化されます。

    • 事前定義済みの一連の名前空間。

    • WITH XMLNAMESPACES を使用して定義されたすべての名前空間。詳細については、「WITH XMLNAMESPACES を使用した名前空間の追加」を参照してください。

    • クエリのプロローグで定義されたすべての名前空間。プロローグ内の名前空間宣言は、WITH XMLNAMESPACES の名前空間宣言よりも優先されます。たとえば、次のクエリでは WITH XMLNAMESPACES で、名前空間 (http://someURI) にバインドされるプレフィックス (pd) が宣言されます。ただし、WHERE 句では、バインドよりもクエリのプロローグが優先されます。

      WITH XMLNAMESPACES ('http://someURI' AS pd)
      SELECT ProductModelID, CatalogDescription.query('
          <Product 
              ProductModelID= "{ sql:column("ProductModelID") }" 
              />
      ') AS Result
      FROM Production.ProductModel
      WHERE CatalogDescription.exist('
          declare namespace  pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
           /pd:ProductDescription[(pd:Specifications)]'
          ) = 1
      

    これらすべての名前空間のバインドは、静的コンテキストの初期化時に解決されます。

  • 型指定された xml 列または変数のクエリを行う場合、列または変数に関連付けられた XML スキーマ コレクションのコンポーネントが静的コンテキストにインポートされます。詳細については、「型指定された XML と型指定されていない XML の比較」を参照してください。

  • インポートされたスキーマ内のすべてのアトミック型では、静的コンテキストでキャスト関数も使用できます。この例を次に示します。この例では、型指定された xml 変数に対してクエリが指定されています。この変数に関連付けられている XML スキーマ コレクションでは、アトミック型である myType が定義されています。静的な分析時に、この型に対応してキャスト関数 myType() を使用できます。クエリ式 (ns:myType(0)) は、myType の値を返します。

    -- DROP XML SCHEMA COLLECTION SC
    -- go
    CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="myNS" xmlns:ns="myNS"
    xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">
          <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
          <simpleType name="myType">
                <restriction base="int">
                 <enumeration value="0" />
                  <enumeration value="1"/>
                </restriction>
          </simpleType>
          <element name="root" type="ns:myType"/>
    </schema>'
    go
    
    DECLARE @var XML(SC)
    SET @var = '<root xmlns="myNS">0</root>'
    -- specify myType() casting function in the query
    SELECT @var.query('declare namespace ns="myNS"; ns:myType(0)')
    

    次の例では、int 組み込み XML 型のキャスト関数が式に指定されています。

    declare @x xml
    set @x = ''
    select @x.query('xs:int(5)')
    go
    

静的コンテキストが初期化されてから、クエリ式が分析 (コンパイル) されます。静的分析では、次のことが行われます。

  1. クエリの解析。

  2. 式で指定された関数名や型名の解決。

  3. クエリの静的な型指定。これにより、クエリがタイプ セーフであることを確認できます。たとえば、+ 演算子は基本的な数値型の引数を必要とするので、次のクエリは静的エラーを返します。

    declare @x xml
    set @x=''
    SELECT @x.query('"x" + 4')
    

    次の例では、value() 演算子は単一の結果になる必要があります。XML スキーマで指定されたように、複数の <Elem> 要素になる場合もあります。式を静的に分析することでタイプ セーフではないと判断され、静的エラーが返されます。エラーを解決するには、単一の結果になることを明示的に指定するように (data(/x:Elem)[1])、式を書き直す必要があります。

    DROP XML SCHEMA COLLECTION SC
    go
    CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="myNS" xmlns:ns="myNS"
    xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">
          <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
          <element name="Elem" type="string"/>
    </schema>'
    go
    
    declare @x xml (SC)
    set @x='<Elem xmlns="myNS">test</Elem><Elem xmlns="myNS">test2</Elem>'
    SELECT @x.value('declare namespace x="myNS"; data(/x:Elem)[1]','varchar(20)')
    

    詳細については、「XQuery と静的な型指定」を参照してください。

実装の制限事項

次に、静的コンテキストに関する制限事項を示します。

  • XPath 互換性モードはサポートされません。

  • XML の構築では、分離構築モードだけがサポートされます。これは既定の設定です。したがって、構築される要素ノードの型は xdt:untyped 型で、属性は xdt:untypedAtomic 型になります。

  • 順序付けられた順序モードだけがサポートされます。

  • XML 領域の分離ポリシーだけがサポートされます。

  • 基本 URI 機能はサポートされません。

  • fn:doc() はサポートされません。

  • fn:collection() はサポートされません。

  • XQuery の静的フラッガは提供されません。

  • xml データ型に関連付けられた照合順序が使用されます。この照合順序は常に Unicode コードポイントの照合順序に設定されます。

動的コンテキスト

動的コンテキストとは、式の実行時に使用できる必要のある情報のことです。静的コンテキスト以外に、動的コンテキストの一環として、次の情報が初期化されます。

  • 次に示すように、コンテキスト アイテム、コンテキストの位置、コンテキスト サイズなどの式のフォーカスが初期化されます。これらのすべての値よりも、nodes() メソッドが優先されることに注意してください。

    • xml データ型では、コンテキスト アイテム、つまり処理対象のノードがドキュメント ノードに設定されます。

    • コンテキストの位置、つまり処理対象のノードからのコンテキスト アイテムの相対位置が、最初は 1 に設定されます。

    • コンテキスト サイズ、つまり処理対象のシーケンス内のアイテム数が、最初は 1 に設定されます。これは、常にドキュメント ノードが 1 つあるためです。

実装の制限事項

次に、動的コンテキストに関する制限事項を示します。

  • 現在日時のコンテキスト関数である、fn:current-date、fn:current-time、および fn:current-dateTime はサポートされません。

  • 暗黙のタイム ゾーンは UTC+0 に固定され、変更できません。

  • fn:doc() 関数はサポートされません。xml 型の列または変数に対して、すべてのクエリが実行されます。

  • fn:collection() 関数はサポートされません。