Поделиться через


count (XQuery)

Возвращает количество элементов, содержащихся в последовательности, указываемой аргументом $arg.

Синтаксис

fn:count($arg as item()*) as xs:integer

Аргументы

  • $arg
    Подсчитываемые элементы.

Замечания

Возвращает 0, если $arg — пустая последовательность.

Примеры

В этом разделе приведены примеры запросов XQuery к экземплярам XML, которые хранятся в различных столбцах типа xml в базе данных AdventureWorks.

А.Использование функции XQuery count() для подсчета количества различных географических расположений цехов, участвующих в производстве определенной модели продукта

Следующий запрос подсчитывает количество цехов, участвующих в производстве продукта определенной модели (ProductModelID=7).

SELECT Production.ProductModel.ProductModelID, 
       Production.ProductModel.Name, 
       Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
       <NoOfWorkStations>
          { count(/AWMI:root/AWMI:Location) }
       </NoOfWorkStations>
') as WorkCtrCount
FROM Production.ProductModel
WHERE Production.ProductModel.ProductModelID=7

В приведенном запросе обратите внимание на следующие моменты.

  • Ключевое слово namespace в прологе XQuery определяет префикс пространства имен. Затем этот префикс используется в теле запроса XQuery.

  • Запрос создает XML, включающий элемент <NoOfWorkStations>.

  • Функция count() в теле запроса XQuery подсчитывает количество элементов <Location>.

Результат:

ProductModelID   Name                 WorkCtrCount     
-------------- ---------------------------------------------------
7             HL Touring Frame  <NoOfWorkStations>6</NoOfWorkStations>   

Можно также создать XML, включающий идентификатор и название модели продукта, как это показано в следующем запросе:

SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
       <NoOfWorkStations
             ProductModelID= "{ sql:column("Production.ProductModel.ProductModelID") }" 
             ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >
          { count(/AWMI:root/AWMI:Location) }
       </NoOfWorkStations>
') as WorkCtrCount
FROM Production.ProductModel
WHERE Production.ProductModel.ProductModelID= 7

Результат:

<NoOfWorkStations ProductModelID="7" 
                  ProductModelName="HL Touring Frame">6</NoOfWorkStations>

Эти значения можно вернуть в формате, отличном от XML, как показано в следующем запросе. Запрос использует метод value() (тип данных xml) для получения количества цехов.

SELECT  ProductModelID, 
        Name, 
        Instructions.value('declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
           count(/AWMI:root/AWMI:Location)', 'int' ) as WorkCtrCount
FROM Production.ProductModel
WHERE ProductModelID=7

Результат:

ProductModelID    Name            WorkCtrCount
-------------- ---------------------------------
7              HL Touring Frame        6   

См. также

Справочник

Функции XQuery для типа данных xml