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/a
Root
和 a
是 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 root
、AWMI:Location
、AWMI:step
和$Step
都是 QNames。AWMI
是前置詞,而root
、Location
和Step
都是本機名稱。變數
$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 規格中所述。