英語で読む

次の方法で共有


シーケンスと 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) では、Roota が 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 rootAWMI:LocationAWMI:step$Step は、すべて QName です。 AWMI はプレフィックスであり、 rootLocationStep はすべてローカル名です。

  • $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 スキーマ コレクションからアクセスできるように予約されます。

注意

この実装では、http://www.w3.org/2004/07/xquery-local-functionsの XQuery 仕様で説明されているように、local プレフィックスはサポートされていません。

参照

XQuery の基礎