式コンテキストとクエリの評価 (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
静的コンテキストが初期化されると、クエリ式が分析 (コンパイル) されます。 静的分析には、次のものが含まれます。
"クエリ解析"。
式で指定された関数と型の名前を解決する。
クエリの静的な型指定。 これにより、クエリがタイプ セーフであることを確認できます。 たとえば、 + 演算子には数値プリミティブ型引数が必要であるため、次のクエリは静的エラーを返します。
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()関数はサポートされていません。
参照
XQuery の基礎
型指定された XML と型指定されていない XML の比較
XML スキーマ コレクション (SQL Server)