"http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
LocationID="20">
Assemble all frame components following blueprint
1299.
...
使用 order by 子句
通過使用 FLWOR 表達式中的 order by 子句可在 XQuery 中進行排序。傳遞到 order by 子句的排序表達式必須返回其類型對於 gt 運算符有效的值。每個排序表達式必須針對每一項生成一個單獨的序列。默認情況下,按升序進行排序。您也可以選擇為每個排序表達式指定升序或降序順序。
注意:
通過在 SQL Server 中實現 XQuery 進行的字元串值的排序比較始終是使用
二進位 Unicode 碼位排序規則來執行的。
以下查詢將從 AdditionalContactInfo 列檢索有關特定客戶的所有電話號碼。結果按電話號碼進行排序。
複製代碼
SELECT AdditionalContactInfo.query('
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
declare namespace aci="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
for $a in /aci:AdditionalContactInfo//act:telephoneNumber
order by $a/act:
number[1] descending
return $a
') As Result
FROM Person.Contact
WHERE ContactID=3
注意,原子化 (XQuery) 進程先檢索 元素的原子值,再將其傳遞到 order by。可以使用 data() 函數編寫表達式,但這並不是必需的。
複製代碼
order by data($a/act:number[1]) descending
結果如下:
複製代碼
可以使用 WITH XMLNAMESPACES 聲明命名空間,而不是在查詢 prolog 中聲明。
複製代碼
WITH XMLNAMESPACES (
'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,
'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)
SELECT AdditionalContactInfo.query('
for $a in /aci:AdditionalContactInfo//act:telephoneNumber
order by $a/act:number[1] descending
return $a
') As Result
FROM Person.Contact
WHERE ContactID=3
還可以按屬性值進行排序。例如,以下查詢將檢索新創建的 元素,其中包含按 LaborHours 屬性以降序順序排序的 LocationID 和 LaborHours 屬性。結果,將首先返回工時最長的生產車間。
複製代碼
SELECT Instructions.query('
declare namespace AWMI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $WC in /AWMI:root/AWMI:Location
order by $WC/@LaborHours descending
return
{ $WC/@LocationID }
{ $WC/@LaborHours }
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7
結果如下:
複製代碼
在以下查詢中,將按元素名稱對結果進行排序。此查詢將從產品目錄中檢索特定產品的規範。這些規範是 元素的子元素。
複製代碼
SELECT CatalogDescription.query('
declare namespace
pd="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
for $a in /pd:ProductDescription/pd:Specifications/*
order by local-name($a)
return $a
') as Result
FROM Production.ProductModel
where ProductModelID=19
注意上述查詢的以下方面:
/p1:ProductDescription/p1:Specifications/* 表達式將返回 元素的子元素。
order by (local-name($a)) 表達式將按元素名稱的本地部分對序列進行排序。
結果如下:
複製代碼
Available in most colors
Almuminum Alloy
Advanced to Professional riders
其排序表達式返回空值的節點將被列在序列的開頭,如以下示例中所示:
複製代碼
declare @x xml
set @x='
'
select @x.query('
for $person in //Person
order by $person/@Name
return $person
')
結果如下:
複製代碼
您可以指定多個排序條件,如以下示例中所示。此示例中的查詢將先按 Title 屬性值再按 Administrator 屬性值對 元素進行排序。
複製代碼
declare @x xml
set @x='
'
SELECT @x.query('for $e in /root/Employee
order by $e/@Title ascending, $e/@Gender descending
return
$e
')
結果如下:
複製代碼
實現限制
限制如下:
不支持在 FLWOR 表達式中使用 let 。
排序表達式必須經過同類類型化。這是通過靜態檢查來確定的。
無法控制對空序列的排序。
不支持對 order by 使用 empty least、empty greatest 和 collation 關鍵字