シーケンスと QName (XQuery)
適用対象: SQL Server
このトピックでは、XQuery の次の基本的な概念について説明します。
シークエンス
QName と事前に定義された名前空間
シークエンス
XQuery では、式の結果は、XML ノードと XSD アトミック型のインスタンスのリストで構成されるシーケンスです。 シーケンス内の個々のエントリは、項目と呼ばれます。 シーケンス内のアイテムは、次のいずれかになります。
要素、属性、テキスト、処理命令、コメント、ドキュメントなどのノード
XSD 単純型のインスタンスなどのアトミック値
たとえば、次のクエリでは、2 つの要素ノードのアイテムのシーケンスが作成されます。
SELECT Instructions.query('
<step1> Step 1 description goes here</step1>,
<step2> Step 2 description goes here </step2>
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7;
結果を次に示します。
<step1> Step 1 description goes here </step1>
<step2> Step 2 description goes here </step2>
前のクエリでは、<step1>
構築の末尾にあるコンマ (,
) がシーケンス コンストラクターであり、必須です。 結果の空白は、説明のためにのみ追加され、このドキュメントのすべての例の結果に含まれています。
シーケンスについて知っておくべき追加情報を次に示します。
クエリの結果が他のシーケンスを含むシーケンスになる場合、含まれているシーケンスは外側のシーケンスにフラット化されます。 たとえば、シーケンス ((1,2, (3,4,5)),6) はデータ モデル内で (1, 2, 3, 4, 5, 6) にフラット化されます。
DECLARE @x xml; SET @x = ''; SELECT @x.query('(1,2, (3,4,5)),6');
空のシーケンスとは、アイテムが含まれていないシーケンスです。 "()" として表されます。
1 つの項目のみを持つシーケンスはアトミック値として扱うことができます。その逆も同様です。 つまり、(1) = 1 です。
この実装では、シーケンスは同種である必要があります。 つまり、アトミック値のシーケンスまたはノードのシーケンスがあります。 たとえば、有効なシーケンスを次に示します。
DECLARE @x xml;
SET @x = '';
-- Expression returns a sequence of 1 text node (singleton).
SELECT @x.query('1');
-- Expression returns a sequence of 2 text nodes
SELECT @x.query('"abc", "xyz"');
-- Expression returns a sequence of one atomic value. data() returns
-- typed value of the node.
SELECT @x.query('data(1)');
-- Expression returns a sequence of one element node.
-- In the expression XML construction is used to construct an element.
SELECT @x.query('<x> {1+2} </x>');
異種シーケンスはサポートされていないため、次のクエリではエラーが返されます。
SELECT @x.query('<x>11</x>, 22');
QName
XQuery の識別子は QName です。 QName は、名前空間プレフィックスとローカル名で構成されます。 この実装では、XQuery の変数名は QName であり、プレフィックスを持つことはできません。
型指定されていない xml 変数に対してクエリを指定する次の例を考えてみましょう。
DECLARE @x xml;
SET @x = '<Root><a>111</a></Root>';
SELECT @x.query('/Root/a');
式 (/Root/a
) では、Root
と a
が QName です。
次の例では、型指定された xml 列に対してクエリを指定します。 クエリは、最初のワークセンターの場所にあるすべての <ステップ> 要素を反復処理します。
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $Step in /AWMI:root/AWMI:Location[1]/AWMI:step
return
string($Step)
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7;
クエリ式で、次の点に注意してください。
AWMI root
、AWMI:Location
、AWMI:step
、$Step
は、すべて QName です。AWMI
はプレフィックスであり、root
、Location
、Step
はすべてローカル名です。$step
変数は QName であり、プレフィックスはありません。
次の名前空間は、SQL Server での XQuery サポートで使用するために事前に定義されています。
Prefix | URI |
---|---|
xs | http://www.w3.org/2001/XMLSchema |
xsi | http://www.w3.org/2001/XMLSchema-instance |
xdt | http://www.w3.org/2004/07/xpath-datatypes |
fn | http://www.w3.org/2004/07/xpath-functions |
(プレフィックスなし) | urn:schemas-microsoft-com:xml-sql |
sqltypes | https://schemas.microsoft.com/sqlserver/2004/sqltypes |
xml | http://www.w3.org/XML/1998/namespace |
(プレフィックスなし) | https://schemas.microsoft.com/sqlserver/2004/SOAP |
作成するすべてのデータベースには、 sys XML スキーマ コレクションがあります。 これらのスキーマは、ユーザーが作成した XML スキーマ コレクションからアクセスできるように予約されます。
Note
この実装では、http://www.w3.org/2004/07/xquery-local-functionsの XQuery 仕様で説明されているように、local
プレフィックスはサポートされていません。