Функции метода доступа к данным — data (XQuery)
Область применения: SQL Server
Возвращает типизированное значение для каждого элемента, указанного $arg.
Синтаксис
fn:data ($arg as item()*) as xdt:untypedAtomic*
Аргументы
$arg
Последовательность элементов, типизированные значения которых будут возвращены.
Замечания
Следующее применимо к типизированным значениям:
Типизированное значение атомного значения является атомным значением.
Типизированное значение узла текста является строковым значением узла текста.
Типизированное значение комментария является строковым значением комментария.
Типизированное значение инструкции по обработке является содержимым инструкции обработки, без целевого имени инструкции обработки.
Типизированное значение узла документов является его строковым значением.
Следующее применимо к узлам атрибутов и элементов:
Если узел атрибута типизирован посредством XML-схемы, его типизированное значение соответственно является типизированным значением.
Если узел атрибута нетипичен, его типизированное значение равно строкового значения, возвращаемого как экземпляр xdt:untypedAtomic.
Если узел элемента не был введен, его типизированное значение равно строкового значения, возвращаемого как экземпляр xdt:untypedAtomic.
Следующие характеристики относятся к типизированным узлам элемента:
Если элемент имеет простой тип контента, data() возвращает типизированное значение элемента.
Если узел имеет сложный тип, включая xs:anyType, data() возвращает статическую ошибку.
Хотя использование функции data() часто является необязательным, как показано в следующих примерах, указывая функцию data() явно увеличивает удобочитаемость запросов. Дополнительные сведения см. в разделе "Основы XQuery".
Нельзя указать данные() в созданном XML, как показано в следующем примере:
declare @x xml
set @x = ''
select @x.query('data(<SomeNode>value</SomeNode>)')
Примеры
В этом разделе приведены примеры XQuery для экземпляров XML, хранящихся в различных столбцах типов XML в базе данных AdventureWorks.
А. Использование функции data() XQuery для извлечения типизированного значения узла
В следующем запросе показано, как функция data() используется для получения значений атрибута, элемента и текстового узла:
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query(N'
for $pd in //p1:ProductDescription
return
<Root
ProductID = "{ data( ($pd//@ProductModelID)[1] ) }"
Feature = "{ data( ($pd/p1:Features/wm:Warranty/wm:Description)[1] ) }" >
</Root>
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19
Результат:
<Root ProductID="19" Feature="parts and labor"/>
Как упоминалось, функция data() является необязательной при создании атрибутов. Если функция data() не указана, предполагается неявно. Этот запрос формирует те же результаты, что и предыдущий запрос:
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
for $pd in //p1:ProductDescription
return
<Root
ProductID = "{ ($pd/@ProductModelID)[1] }"
Feature = "{ ($pd/p1:Features/wm:Warranty/wm:Description)[1] }" >
</Root>
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19
В следующих примерах показаны экземпляры, в которых требуется функция data().
В следующем запросе $pd/p1:Specification/Material возвращает <Material
> элемент. Кроме того, data($pd/p1:Specification/Material) возвращает символьные данные, типизированные как xdt:untypedAtomic, так как <Material
> нетипичен. Если входные данные нетипичены, результат data() вводится как xdt:untypedAtomic.
SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
for $pd in //p1:ProductDescription
return
<Root>
{ $pd/p1:Specifications/Material }
{ data($pd/p1:Specifications/Material) }
</Root>
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19
Результат:
<Root>
<Material>Aluminum Alloy</Material>Aluminum Alloy
</Root>
В следующем запросе data($pd/p1:Features/wm:Warranty) возвращает статическую ошибку, так как <Warranty
> это сложный элемент типа.
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
<Root>
{ /p1:ProductDescription/p1:Features/wm:Warranty }
{ data(/p1:ProductDescription/p1:Features/wm:Warranty) }
</Root>
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 23