Итерация и инструкция FLWOR (XQuery)FLWOR Statement and Iteration (XQuery)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server нетБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Язык XQuery определяет синтаксис итераций инструкции FLWOR.XQuery defines the FLWOR iteration syntax. Слово FLWOR — это сокращение от слов for, let, where, order by и return.FLWOR is the acronym for for, let, where, order by, and return.

Инструкция FLWOR состоит из следующих частей.A FLWOR statement is made up of the following parts:

  • Одно или несколько предложений FOR, которые привязывают одну или несколько переменных-итераторов к входным последовательностям.One or more FOR clauses that bind one or more iterator variables to input sequences.

    Входные последовательности также могут быть выражениями XQuery (например, выражениями XPath).Input sequences can be other XQuery expressions such as XPath expressions. Они являются либо последовательностями узлов, либо последовательностями атомарных значений.They are either sequences of nodes or sequences of atomic values. Последовательности атомарных значений могут быть получены с помощью литералов или функций-конструкторов.Atomic value sequences can be constructed using literals or constructor functions. В SQL ServerSQL Server нельзя использовать построенные XML-узлы в качестве входных последовательностей.Constructed XML nodes are not allowed as input sequences in SQL ServerSQL Server.

  • Необязательное предложение let.An optional let clause. Это предложение присваивает значение данной переменной для конкретной итерации.This clause assigns a value to the given variable for a specific iteration. Присвоенное выражение может быть выражением XQuery, например выражением XPath, и может возвращать либо последовательность узлов, либо последовательность атомарных значений.The assigned expression can be an XQuery expression such as an XPath expression, and can return either a sequence of nodes or a sequence of atomic values. Последовательности атомарных значений могут быть получены с помощью литералов или функций-конструкторов.Atomic value sequences can be constructed by using literals or constructor functions. В SQL ServerSQL Server нельзя использовать построенные XML-узлы в качестве входных последовательностей.Constructed XML nodes are not allowed as input sequences in SQL ServerSQL Server.

  • Переменная-итератор.An iterator variable. Дополнительно для этой переменной с помощью ключевого слова as можно указать тип.This variable can have an optional type assertion by using the as keyword.

  • Необязательное предложение where.An optional where clause. Это предложение применяется в качестве предиката фильтра при итерации.This clause applies a filter predicate on the iteration.

  • Необязательное предложение order by.An optional order by clause.

  • Выражение return.A return expression. Выражение в предложении return конструирует результат, возвращаемый инструкцией FLWOR.The expression in the return clause constructs the result of the FLWOR statement.

Например, следующий запрос выполняет итерацию элементов <Step> в первом месте производства и возвращает строковое значение <Step> узлов:For example, the following query iterates over the <Step> elements at the first manufacturing location and returns the string value of the <Step> nodes:

declare @x xml  
set @x='<ManuInstructions ProductModelID="1" ProductModelName="SomeBike" >  
<Location LocationID="L1" >  
  <Step>Manu step 1 at Loc 1</Step>  
  <Step>Manu step 2 at Loc 1</Step>  
  <Step>Manu step 3 at Loc 1</Step>  
</Location>  
<Location LocationID="L2" >  
  <Step>Manu step 1 at Loc 2</Step>  
  <Step>Manu step 2 at Loc 2</Step>  
  <Step>Manu step 3 at Loc 2</Step>  
</Location>  
</ManuInstructions>'  
SELECT @x.query('  
   for $step in /ManuInstructions/Location[1]/Step  
   return string($step)  
')  

Результат:This is the result:

Manu step 1 at Loc 1 Manu step 2 at Loc 1 Manu step 3 at Loc 1  

Следующий запрос похож на предыдущий, за тем исключением, что он применяется к типизированному XML-столбцу Instructions в таблице ProductModel.The following query is similar to the previous one, except that it is specified against the Instructions column, a typed xml column, of the ProductModel table. Запрос выполняет итерацию по всем этапам производства, <step> элементы, в первом расположении цеха для конкретного продукта.The query iterates over all the manufacturing steps, <step> elements, at the first work center location for a specific product.

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  

Обратите внимание на следующие данные из предыдущего запроса:Note the following from the previous query:

  • Переменная $Step является переменной-итератором.The $Step is the iterator variable.

  • Выражение пути, //AWMI:root/AWMI:Location[1]/AWMI:stepсоздает входную последовательность.The path expression, //AWMI:root/AWMI:Location[1]/AWMI:step, generates the input sequence. Эта последовательность является последовательностью элементов <step> узлов элементов первого узла элемента <Location>.This sequence is the sequence of the <step> element node children of the first <Location> element node.

  • Необязательное предложение-предикат where не указано.The optional predicate clause, where, is not used.

  • return Выражение возвращает строковое значение из элемента <step>.The return expression returns a string value from the <step> element.

Функция String (XQuery) используется для получения строкового значения <step узла>.The string function (XQuery) is used to retrieve the string value of the <step> node.

Частичный результат:This is the partial result:

Insert aluminum sheet MS-2341 into the T-85A framing tool.   
Attach Trim Jig TJ-26 to the upper and lower right corners of   
the aluminum sheet. ....         

Ниже приведены примеры других допустимых входных последовательностей:These are examples of additional input sequences that are allowed:

declare @x xml  
set @x=''  
SELECT @x.query('  
for $a in (1, 2, 3)  
  return $a')  
-- result = 1 2 3   
  
declare @x xml  
set @x=''  
SELECT @x.query('  
for $a in   
   for $b in (1, 2, 3)  
      return $b  
return $a')  
-- result = 1 2 3  
  
declare @x xml  
set @x='<ROOT><a>111</a></ROOT>'  
SELECT @x.query('  
  for $a in (xs:string( "test"), xs:double( "12" ), data(/ROOT/a ))  
  return $a')  
-- result test 12 111  

В SQL ServerSQL Server разнородные последовательности не допускаются.In SQL ServerSQL Server, heterogeneous sequences are not allowed. В частности, недопустимы последовательности, содержащие и атомарные значения, и узлы.Specifically, sequences that contain a mixture of atomic values and nodes are not allowed.

Итерации часто используются вместе с синтаксисом конструкций XML в преобразовании XML-форматов, как показано в следующем запросе.Iteration is frequently used together with the XML Construction syntax in transforming XML formats, as shown in the next query.

В образце базы данных AdventureWorks производственные инструкции, хранящиеся в столбце Instructions таблицы Production. ProductModel , имеют следующий вид:In the AdventureWorks sample database, the manufacturing instructions stored in the Instructions column of the Production.ProductModel table have the following form:

<Location LocationID="10" LaborHours="1.2"   
            SetupHours=".2" MachineHours=".1">  
  <step>describes 1st manu step</step>  
   <step>describes 2nd manu step</step>  
   ...  
</Location>  
...  

Следующий запрос строит новый XML с <Location> элементами с атрибутами расположения рабочего центра, возвращаемыми как дочерние элементы:The following query constructs new XML that has the <Location> elements with the work center location attributes returned as child elements:

<Location>  
   <LocationID>10</LocationID>  
   <LaborHours>1.2</LaborHours>  
   <SetupHours>.2</SetupHours>  
   <MachineHours>.1</MachineHours>  
</Location>  
...  

Запрос является таковым:This is the query:

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        for $WC in /AWMI:root/AWMI:Location  
        return  
          <Location>  
            <LocationID> { data($WC/@LocationID) } </LocationID>  
            <LaborHours>   { data($WC/@LaborHours) }   </LaborHours>  
            <SetupHours>   { data($WC/@SetupHours) }   </SetupHours>  
            <MachineHours> { data($WC/@MachineHours) } </MachineHours>  
          </Location>  
') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

Обратите внимание на следующие данные из предыдущего запроса:Note the following from the previous query:

  • Инструкция FLWOR извлекает последовательность <Location> элементов для конкретного продукта.The FLWOR statement retrieves a sequence of <Location> elements for a specific product.

  • Функция data (XQuery) используется для извлечения значения каждого атрибута, поэтому они будут добавлены в результирующий XML как текстовые узлы, а не как атрибуты.The data function (XQuery) is used to extract the value of each attribute so they will be added to the resulting XML as text nodes instead of as attributes.

  • Выражение в предложении RETURN конструирует требуемый XML-документ.The expression in the RETURN clause constructs the XML that you want.

Частичный результат:This is a partial result:

<Location>  
  <LocationID>10</LocationID>  
  <LaborHours>2.5</LaborHours>  
  <SetupHours>0.5</SetupHours>  
  <MachineHours>3</MachineHours>  
</Location>  
<Location>  
   ...  
<Location>  
...  

Использование предложения letUsing the let Clause

Предложение let может быть использовано для именования повторяющихся выражений, на которые можно ссылаться с помощью ссылок на переменные.You can use the let clause to name repeating expressions that you can refer to by referring to the variable. Выражение, присвоенное переменной let, будет вставляться в запрос каждый раз, когда эта переменная будет упоминаться в запросе.The expression assigned to a let variable is inserted into the query every time the variable is referenced in the query. Это означает, что инструкция будет выполнена столько раз, сколько было ссылок на выражение.This means that the statement is executed as many times as the expression gets referenced.

В производственных инструкциях в базе данных AdventureWorks2012AdventureWorks2012 хранятся сведения о необходимых инструментах и о местах их применения.In the AdventureWorks2012AdventureWorks2012 database, the manufacturing instructions contain information about the tools required and the location where the tools are used. В следующем запросе, чтобы составить список инструментов, необходимых для постройки производственной модели, а также мест, где будет нужен каждый инструмент, применяется предложение let.The following query uses the let clause to list the tools required to build a production model, as well as the locations where each tool is needed.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        for $T in //AWMI:tool  
            let $L := //AWMI:Location[.//AWMI:tool[.=data($T)]]  
        return  
          <tool desc="{data($T)}" Locations="{data($L/@LocationID)}"/>  
') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

Применение предложения whereUsing the where Clause

Для фильтрации результатов итерации можно использовать where предложение.You can use the where clause to filter results of an iteration. Это продемонстрировано в следующем примере.This is illustrated in this next example.

При изготовлении велосипеда производственный процесс проходит через цепочку цехов.In the manufacturing of a bicycle, the manufacturing process goes through a series of work center locations. Для каждого цеха определена последовательность производственных операций.Each work center location defines a sequence of manufacturing steps. Следующий запрос получает только те цеха, которые занимаются изготовлением модели велосипеда и включают менее трех производственных операций,The following query retrieves only those work center locations that manufacture a bicycle model and have less than three manufacturing steps. Это значит, что у них меньше трех <step> элементов.That is, they have less than three <step> elements.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
for $WC in /AWMI:root/AWMI:Location  
      where count($WC/AWMI:step) < 3  
      return  
          <Location >  
           { $WC/@LocationID }   
          </Location>  
') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

При рассмотрении предыдущего запроса необходимо отметить следующее.Note the following in the previous query:

  • Ключевое слово Count () используется для подсчета количества <step> дочерних элементов в каждом из расположений цеха. whereThe where keyword uses the count() function to count the number of <step> child elements in each work center location.

  • Выражение return конструирует XML-документ на основании результатов итерации.The return expression constructs the XML that you want from the results of the iteration.

Результат:This is the result:

<Location LocationID="30"/>   

Результат выражения в предложении where преобразуется в логическое значение по описанным ниже правилам (в указанном порядке).The result of the expression in the where clause is converted to a Boolean value by using the following rules, in the order specified. Это те же правила, которые применяются к предикатам в выражениях пути, за исключением того, что в данном случае целочисленные значения недопустимы.These are the same as the rules for predicates in path expressions, except that integers are not allowed:

  1. Если выражение where возвращает пустую последовательность, действительное логическое значение равно False.If the where expression returns an empty sequence, its effective Boolean value is False.

  2. Если выражение where возвращает одно значение простого логического типа, результатом является это действительное логическое значение.If the where expression returns one simple Boolean type value, that value is the effective Boolean value.

  3. Если выражение where возвращает последовательность, в которой содержится хотя бы один узел, действительное логическое значение равно True.If the where expression returns a sequence that contains at least one node, the effective Boolean value is True.

  4. В остальных случаях выдается статическая ошибка.Otherwise, it raises a static error.

Множественная привязка переменных в инструкции FLWORMultiple Variable Binding in FLWOR

В одном выражении инструкции FLWOR можно привязывать к входным последовательностям несколько переменных.You can have a single FLWOR expression that binds multiple variables to input sequences. В следующем примере выполняется запрос к нетипизированной переменной типа xml.In the following example, the query is specified against an untyped xml variable. Выражение FLOW возвращает первый <Step> дочерний элемент в каждом элементе> Location <.The FLOWR expression returns the first <Step> element child in each <Location> element.

declare @x xml  
set @x='<ManuInstructions ProductModelID="1" ProductModelName="SomeBike" >  
<Location LocationID="L1" >  
  <Step>Manu step 1 at Loc 1</Step>  
  <Step>Manu step 2 at Loc 1</Step>  
  <Step>Manu step 3 at Loc 1</Step>  
</Location>  
<Location LocationID="L2" >  
  <Step>Manu step 1 at Loc 2</Step>  
  <Step>Manu step 2 at Loc 2</Step>  
  <Step>Manu step 3 at Loc 2</Step>  
</Location>  
</ManuInstructions>'  
SELECT @x.query('  
   for $Loc in /ManuInstructions/Location,  
       $FirstStep in $Loc/Step[1]  
   return   
       string($FirstStep)  
')  

Обратите внимание на следующие данные из предыдущего запроса:Note the following from the previous query:

  • for Выражение определяет $Loc и $FirstStep Variables.The for expression defines $Loc and $FirstStep variables.

  • two Выражения /ManuInstructions/Location и $FirstStep in $Loc/Step[1]являются связанными в том, что значения $FirstStep зависят от значений. $LocThe two expressions, /ManuInstructions/Location and $FirstStep in $Loc/Step[1], are correlated in that the values of $FirstStep depend on the values of $Loc.

  • Выражение, связанное $Loc с, формирует последовательность <Location> элементов.The expression associated with $Loc generates a sequence of <Location> elements. Для каждого элемента Location> <$FirstStep создает последовательность из одного элемента <Step>, Singleton.For each <Location> element, $FirstStep generates a sequence of one <Step> element, a singleton.

  • переменная $Loc указана в выражении, связанном с переменной $FirstStep.$Loc is specified in the expression associated with the $FirstStep variable.

Результат:This is the result:

Manu step 1 at Loc 1   
Manu step 1 at Loc 2  

Следующий запрос аналогичен, за исключением того, что он указан в столбце инструкций, типизированном столбце XML таблицы ProductModel .The following query is similar, except that it is specified against the Instructions column, typed xml column, of the ProductModel table. Для создания требуемого XML-кода используется конструкция XML (XQuery) .XML Construction (XQuery) is used to generate the XML that you want.

SELECT Instructions.query('  
     declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
for $WC in /root/Location,  
            $S  in $WC/step  
      return  
          <Step LocationID= "{$WC/@LocationID }" >  
            { $S/node() }  
          </Step>  
') as Result  
FROM  Production.ProductModel  
WHERE ProductModelID=7  

При рассмотрении предыдущего запроса необходимо отметить следующее.Note the following in the previous query:

  • Предложение for определяет две переменные: $WC и $S.The for clause defines two variables, $WC and $S. Выражение, связанное с $WC, формирует последовательность цехов, участвующих в производстве велосипедов.The expression associated with $WC generates a sequence of work center locations in the manufacturing of a bicycle product model. Выражение пути, присвоенное переменной $S, формирует последовательность операций для каждого цеха, содержащегося в переменной $WC.The path expression assigned to the $S variable generates a sequence of steps for each work center location sequence in the $WC.

  • Оператор return конструирует XML с элементом <Step>, который содержит шаг производства и LocationID в качестве его атрибута.The return statement constructs XML that has a <Step> element that contains the manufacturing step and the LocationID as its attribute.

  • Объявление пространства имен элемента по умолчанию используется в прологе XQuery, чтобы все объявления пространств имен в результирующем XML-коде отображались в элементе верхнего уровня.The declare default element namespace is used in the XQuery prolog so that all the namespace declarations in the resulting XML appear at the top-level element. Это повышает удобочитаемость результата.This makes the result more readable. Дополнительные сведения о пространствах имен по умолчанию см. в разделе обработка пространств имен в XQuery.For more information about default namespaces, see Handling Namespaces in XQuery.

Частичный результат:This is the partial result:

<Step xmlns=  
    "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"     
  LocationID="10">  
     Insert <material>aluminum sheet MS-2341</material> into the <tool>T-   
     85A framing tool</tool>.   
</Step>  
...  
<Step xmlns=  
      "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"     
    LocationID="20">  
        Assemble all frame components following blueprint   
        <blueprint>1299</blueprint>.  
</Step>  
...  

Применение предложения order byUsing the order by Clause

В языке XQuery сортировка в выражении FLWOR выполняется с помощью предложения order by.Sorting in XQuery is performed by using the order by clause in the FLWOR expression. Выражения сортировки, передаваемые в order by предложение, должны возвращать значения, типы которых допустимы для оператора gt .The sorting expressions passed to the order by clause must return values whose types are valid for the gt operator. Каждое сортируемое выражение должно возвращать последовательность, состоящую из одного элемента.Each sorting expression must result in a singleton a sequence with one item. По умолчанию сортировка выполняется в порядке возрастания.By default, sorting is performed in ascending order. Для каждого из сортируемых выражений можно указать сортировку по возрастанию или по убыванию.You can optionally specify ascending or descending order for each sorting expression.

Примечание

При сортировке сравнение символьных значений, выполняемых реализацией языка XQuery в SQL ServerSQL Server, всегда выполняется с использованием параметров сортировки двоичных элементов кода Юникода.Sorting comparisons on string values performed by the XQuery implementation in SQL ServerSQL Server are always performed by using the binary Unicode codepoint collation.

Следующий запрос получает все телефонные номера указанного заказчика из столбца AdditionalContactInfo.The following query retrieves all the telephone numbers for a specific customer from the AdditionalContactInfo column. Результат сортируется по номеру телефона.The results are sorted by telephone number.

USE AdventureWorks2012;  
GO  
SELECT AdditionalContactInfo.query('  
   declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
   declare namespace aci="https://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.Person  
WHERE BusinessEntityID=291;  

Обратите внимание, что процесс разъединения (XQuery) получает атомарное значение <number> элементов перед их передачей order byв.Note that the Atomization (XQuery) process retrieves the atomic value of the <number> elements before passing it to order by. Можно написать выражение с помощью функции Data () , но это не является обязательным.You can write the expression by using the data() function, but that is not required.

order by data($a/act:number[1]) descending  

Результат:This is the result:

<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  <act:number>333-333-3334</act:number>  
</act:telephoneNumber>  
<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  <act:number>333-333-3333</act:number>  
</act:telephoneNumber>  

Вместо объявления пространства имен в прологе запроса можно объявить его с помощью предложения WITH XMLNAMESPACES.Instead of declaring the namespaces in the query prolog, you can declare them by using WITH XMLNAMESPACES.

WITH XMLNAMESPACES (  
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,  
   'https://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.Person  
WHERE BusinessEntityID=291;  

Сортировка может также выполняться по значению атрибута.You can also sort by attribute value. Например, следующий запрос получает только что созданные элементы <Location> с атрибутами LocationID и LaborHours, отсортированными по атрибуту LaborHours в порядке убывания.For example, the following query retrieves the newly created <Location> elements that have the LocationID and LaborHours attributes sorted by the LaborHours attribute in descending order. В результате цеха, имеющие максимальное число рабочих часов, будут возвращены первыми.As a result, the work center locations that have the maximum labor hours are returned first.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
for $WC in /AWMI:root/AWMI:Location   
order by $WC/@LaborHours descending  
        return  
          <Location>  
             { $WC/@LocationID }   
             { $WC/@LaborHours }   
          </Location>  
') as Result  
FROM Production.ProductModel  
WHERE ProductModelID=7;  

Результат:This is the result:

<Location LocationID="60" LaborHours="4"/>  
<Location LocationID="50" LaborHours="3"/>  
<Location LocationID="10" LaborHours="2.5"/>  
<Location LocationID="20" LaborHours="1.75"/>  
<Location LocationID="30" LaborHours="1"/>  
<Location LocationID="45" LaborHours=".5"/>  

В следующем запросе результат сортируется по имени элемента.In the following query, the results are sorted by element name. Запрос получает характеристики указанного продукта из каталога продукции.The query retrieves the specifications of a specific product from the product catalog. Спецификации являются дочерними элементами элемента <Specifications>.The specifications are the children of the <Specifications> element.

SELECT CatalogDescription.query('  
     declare namespace  
 pd="https://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;  

Обратите внимание на следующие данные из предыдущего запроса:Note the following from the previous query:

  • /p1:ProductDescription/p1:Specifications/* Выражение возвращает дочерние элементы <Specifications>.The /p1:ProductDescription/p1:Specifications/* expression returns element children of <Specifications>.

  • Выражение order by (local-name($a)) сортирует последовательность по локальной части имени элемента.The order by (local-name($a)) expression sorts the sequence by the local part of the element name.

Результат:This is the result:

<Color>Available in most colors</Color>  
<Material>Almuminum Alloy</Material>  
<ProductLine>Mountain bike</ProductLine>  
<RiderExperience>Advanced to Professional riders</RiderExperience>  
<Style>Unisex</Style>    

Узлы, в которых сортируемые выражения возвращают пустую последовательность, будут помещены в начало, как показано в следующем примере:Nodes in which the ordering expression returns empty are sorted to the start of the sequence, as shown in the following example:

declare @x xml  
set @x='<root>  
  <Person Name="A" />  
  <Person />  
  <Person Name="B" />  
</root>  
'  
select @x.query('  
  for $person in //Person  
  order by $person/@Name  
  return   $person  
')  

Результат:This is the result:

<Person />  
<Person Name="A" />  
<Person Name="B" />  

Следующий пример показывает, каким образом можно указать несколько критериев сортировки.You can specify multiple sorting criteria, as shown in the following example. Запрос в этом примере сортирует <Employee> элементы сначала по заголовку, а затем по значениям атрибута администратора.The query in this example sorts <Employee> elements first by Title and then by Administrator attribute values.

declare @x xml  
set @x='<root>  
  <Employee ID="10" Title="Teacher"        Gender="M" />  
  <Employee ID="15" Title="Teacher"  Gender="F" />  
  <Employee ID="5" Title="Teacher"         Gender="M" />  
  <Employee ID="11" Title="Teacher"        Gender="F" />  
  <Employee ID="8" Title="Administrator"   Gender="M" />  
  <Employee ID="4" Title="Administrator"   Gender="F" />  
  <Employee ID="3" Title="Teacher"         Gender="F" />  
  <Employee ID="125" Title="Administrator" Gender="F" /></root>'  
SELECT @x.query('for $e in /root/Employee  
order by $e/@Title ascending, $e/@Gender descending  
  
  return  
     $e  
')  

Результат:This is the result:

<Employee ID="8" Title="Administrator" Gender="M" />  
<Employee ID="4" Title="Administrator" Gender="F" />  
<Employee ID="125" Title="Administrator" Gender="F" />  
<Employee ID="10" Title="Teacher" Gender="M" />  
<Employee ID="5" Title="Teacher" Gender="M" />  
<Employee ID="11" Title="Teacher" Gender="F" />  
<Employee ID="15" Title="Teacher" Gender="F" />  
<Employee ID="3" Title="Teacher" Gender="F" />  

Ограничения реализацииImplementation Limitations

Существуют следующие ограничения:These are the limitations:

  • Сортируемые выражения должны быть однородно типизированы.The sorting expressions must be homogeneously typed. Эта проверка выполняется статически.This is statically checked.

  • Нельзя управлять сортировкой пустых последовательностей.Sorting empty sequences cannot be controlled.

  • Ключевые слова empty least, empty greatest и collation в выражении order by не поддерживаются.The empty least, empty greatest, and collation keywords on order by are not supported

См. также:See Also

Выражения языка XQueryXQuery Expressions