順序和 QName (XQuery)
此主題描述下列 XQuery 基礎概念:
序列
QName 和預先定義的命名空間
序列
在 XQuery 中,運算式的結果是由 XML 節點清單和 XSD 不可部份完成類型的執行個體所組合之序列。序列中的個別項目 (Entry) 稱為項目 (Item)。序列中的項目可以是下列其中一項:
一個節點,例如元素、屬性、文字、處理指示、註解或文件。
一個不可部份完成的值,例如 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 中的變數名稱為 QName,而且不能有前置詞。
請設想下列範例,在其中查詢是針對不具類型的 xml 變數指定:
DECLARE @x xml
SET @x = '<Root><a>111</a></Root>'
SELECT @x.query('/Root/a')
在運算式 (/Root/a) 中,Root 和 a 是 QName。
在下列範例中,查詢是針對 xml 類型的資料行指定。查詢會重複執行位於第一個工作中心位置的所有 <step> 元素。
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 支援一起使用。
前置詞 |
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 結構描述集合都能存取這些結構描述。如需詳細資訊,請參閱<內建 XML 結構描述集合 (sys)>。
[!附註]
此實作並不支援 local 前置詞,如 http://www.w3.org/2004/07/xquery-local-functions 中的 XQuery 規格所述。