次の方法で共有


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

適用対象: SQL Server

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

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

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

静的コンテキスト

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

  • 連結空白ポリシーはストリップに設定されます。 したがって、境界の空白は、クエリ内の any 要素 および 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 は名前空間 (https://someURI) にバインドするプレフィックス (pd) を宣言します。 ただし、WHERE 句では、バインドよりもクエリのプロローグがオーバーライドされます。

      WITH XMLNAMESPACES ('https://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-datefn:current-time、および fn:current-dateTime はサポートされていません。

  • 単純タイムゾーンは UTC+0 に固定されており、変更できません。

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

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

参照

XQuery の基礎
型指定された XML と型指定されていない XML の比較
XML スキーマ コレクション (SQL Server)