Sequence 和 QNames (XQuery)

適用於:SQL Server

本主題描述下列 XQuery 的基本概念:

  • 序列

  • QName 和預先定義的命名空間

序列

在 XQuery 中,運算式的結果是由 XML 節點和 XSD 不可部分完成類型的實例清單所組成。 序列中的個別專案稱為專案。 序列中的專案可以是下列其中一項:

  • 節點,例如專案、屬性、文字、處理指示、批註或檔

  • 不可部分完成的值,例如 XSD 簡單類型的實例

例如,下列查詢會建構兩個專案節點專案的序列:

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。

在此實作中,序列必須是同質的。 也就是說,您有一連串不可部分完成的值或一連串的節點。 例如,下列是有效的序列:

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/aRoota 是 QNames。

在下列範例中,會針對具類型的 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 都是 QNames。 AWMI 是前置詞,而 rootLocationStep 都是本機名稱。

  • 變數 $step 是 QName,沒有前置詞。

下列命名空間是預先定義的,可用於 SQL Server 中的 XQuery 支援。

首碼 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 如 中的 http://www.w3.org/2004/07/xquery-local-functions XQuery 規格中所述。

另請參閱

XQuery 基本概念