式コンテキストとクエリの評価 (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
静的コンテキストが初期化されてから、クエリ式が分析 (コンパイル) されます。静的分析では、次のことが行われます。
クエリの解析。
式で指定された関数名や型名の解決。
クエリの静的な型指定。これにより、クエリがタイプ セーフであることを確認できます。たとえば、+ 演算子は基本的な数値型の引数を必要とするので、次のクエリは静的エラーを返します。
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() 関数はサポートされません。