シーケンスと QName (XQuery)
適用対象:SQL Server
このトピックでは、XQuery の次の基本的な概念について説明します。
Sequence
QName と事前に定義された名前空間
Sequence
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 の変数名は QNames であり、プレフィックスを持つことはできません。
型指定されていない 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 スキーマ コレクションからアクセスできるように予約されます。
注意
この実装では、 の local
XQuery 仕様 http://www.w3.org/2004/07/xquery-local-functionsで説明されているように、プレフィックスはサポートされていません。