Funções do Acessador de Dados – data (XQuery)
Aplica-se: SQL Server
Retorna o valor digitado para cada item especificado por $arg.
Sintaxe
fn:data ($arg as item()*) as xdt:untypedAtomic*
Argumentos
$arg
Sequência de itens cujos valores digitados serão retornados.
Comentários
As descrições a seguir aplicam-se a valores digitados:
O valor digitado de um valor atômico é o valor atômico.
O valor digitado de um nó de texto é o valor da cadeia de caracteres do nó de texto.
O valor digitado de um comentário é o valor da cadeia de caracteres do comentário.
O valor digitado de uma instrução de processamento é o conteúdo da instrução de processamento, sem o nome de destino da instrução de processamento.
O valor digitado de um nó de documento é seu valor de cadeia de caracteres.
As descrições a seguir aplicam-se a atributo e nós de elemento:
Se um nó de atributo é digitado com um tipo de esquema XML, seu valor digitado será o valor digitado.
Se o nó de atributo não for tipado, seu valor tipado será igual ao valor da cadeia de caracteres que é retornado como uma instância de xdt:untypedAtomic.
Se o nó do elemento não tiver sido digitado, seu valor digitado será igual ao valor da cadeia de caracteres que é retornado como uma instância de xdt:untypedAtomic.
As descrições a seguir aplicam-se a nós de elemento digitados:
Se o elemento tiver um tipo de conteúdo simples, data() retornará o valor digitado do elemento.
Se o nó for de tipo complexo, incluindo xs:anyType, data() retornará um erro estático.
Embora o uso da função data() seja frequentemente opcional, conforme mostrado nos exemplos a seguir, especificar a função data() aumenta explicitamente a legibilidade da consulta. Para obter mais informações, consulte Noções básicas do XQuery.
Você não pode especificar data() em XML construído, conforme mostrado a seguir:
declare @x xml
set @x = ''
select @x.query('data(<SomeNode>value</SomeNode>)')
Exemplos
Este tópico fornece exemplos de XQuery em relação a instâncias XML armazenadas em várias colunas de tipo xml no banco de dados AdventureWorks.
R. Usando a função data() XQuery para extrair valor com tipo de um nó
A consulta a seguir ilustra como a função data() é usada para recuperar valores de um atributo, um elemento e um nó de texto:
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
Este é o resultado:
<Root ProductID="19" Feature="parts and labor"/>
Como mencionado, a função data() é opcional quando você está construindo atributos. Se você não especificar a função data(), ela será assumida implicitamente. A consulta a seguir produz os mesmos resultados da consulta prévia:
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
Os exemplos a seguir ilustram instâncias em que a função data() é necessária.
Na consulta a seguir, $pd/p1:Specifications/Material retorna o <Material
> elemento. Além disso, data($pd/p1:Specifications/ Material) retorna dados de caracteres digitados como xdt:untypedAtomic, porque <Material
> não é tipado. Quando a entrada não é digitada, o resultado de data() é digitado como 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
Este é o resultado:
<Root>
<Material>Aluminum Alloy</Material>Aluminum Alloy
</Root>
Na consulta a seguir, data($pd/p1:Features/wm:Warranty) retorna um erro estático, pois <Warranty
> é um elemento de tipo complexo.
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