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


Функции метода доступа к данным — string (XQuery)

Область применения:SQL Server

Возвращает значение $arg , представленное в виде строки.

Синтаксис

fn:string() as xs:string
fn:string($arg as item()?) as xs:string

Аргументы

$arg

Узел или атомарное значение.

Замечания

  • Если $arg пустая последовательность, возвращается строка нулевой длины.

  • Если $arg является узлом, функция возвращает строковое значение узла, полученного с помощью метода доступа со строковым значением. Это определено в спецификации W3C XQuery 1.0 и XPath 2.0 Data Model.

  • Если $arg является атомарным значением, функция возвращает ту же строку, которая возвращается приведением выражений, как xs:string$arg, за исключением случаев, когда указано в противном случае.

  • Если тип $arg равен xs:anyURI, универсальный код ресурса (URI) преобразуется в строку без экранирования специальных символов.

  • В этой реализации fn:string() без аргумента можно использовать только в контексте предиката, зависящей от контекста. В частности, его можно использовать только в квадратных скобках ([ ]).

Примеры

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

А. Использование строковой функции

Следующий запрос извлекает дочерний <Features> узел <ProductDescription> элемента.

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
 /PD:ProductDescription/PD:Features
')
FROM Production.ProductModel
WHERE ProductModelID = 19;

Ниже приведен частичный результат:

<PD:Features xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
   These are the product highlights.
   <p1:Warranty xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
    <p1:WarrantyPeriod>3 years</p1:WarrantyPeriod>
    <p1:Description>parts and labor</p1:Description>
   </p1:Warranty>
       ...
</PD:Features>

Если указать функцию string() , вы получите строковое значение указанного узла.

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
 string(/PD:ProductDescription[1]/PD:Features[1])
')
FROM Production.ProductModel
WHERE ProductModelID = 19;

Вот частичный результат.

These are the product highlights.
3 yearsparts and labor...

B. Использование строковой функции на различных узлах

В следующем примере экземпляр XML назначается переменной типа xml. Запросы указываются для иллюстрации результата применения string() к различным узлам.

DECLARE @x AS XML;

SET @x = '<?xml version="1.0" encoding="UTF-8" ?>
<!--  This is a comment -->
<root>
  <a>10</a>
just text
  <b attr="x">20</b>
</root>
';

Следующий запрос получает строковое значение узла документов. Это значение формируется сцеплением строкового значения всех текстовых узлов, являющихся его потомками.

SELECT @x.query('string(/)');

Ниже приведен результат:

This is a comment 10
just text
 20

Следующий запрос пытается получить строковое значение узла инструкции по обработке. Результатом является пустая последовательность, так как она не содержит текстовый узел.

SELECT @x.query('string(/processing-instruction()[1])');

Следующий запрос получает строковое значение узла комментариев и возвращается текстовый узел.

SELECT @x.query('string(/comment()[1])');

Ниже приведен результат:

This is a comment