Função data (XQuery)
Retorna o valor digitado de cada item especificado por $arg.
Sintaxe
fn:data ($arg as item()*) as xdt:untypedAtomic*
Argumentos
- $arg
Seqüê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 é digitado, seu valor digitado é igual a seu valor de cadeia de caracteres que é retornado como uma instância xdt:untypedAtomic.
Se o nó de elemento não foi digitado, seu valor digitado é igual a seu valor de cadeia de caracteres que é retornado como uma instância 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, inclusive xs:anyType, data() retornará um erro estático.
Embora o uso da função data() seja muitas vezes opcional, como mostrado nos exemplos a seguir, especificar a função data() explicitamente aumenta a legibilidade da consulta. Para obter mais informações, consulte Fundamentos de XQuery.
Você não pode especificar data() em XML construído, do seguinte modo:
declare @x xml
set @x = ''
select @x.query('data(<SomeNode>value</SomeNode>)')
Exemplos
Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas do tipo xml no banco de dados AdventureWorks. Para obter uma visão geral de cada uma dessas colunas, consulte Representação de tipo de dados xml no banco de dados do AdventureWorks.
A. Usando a função data() XQuery para extrair valor digitado de um nó
A consulta a seguir ilustra como a função data() é usada para recuperar valores de um atributo, elemento ou 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ê estiver construindo atributos. Se você não especificar a função data(), ela é 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 elemento <Material>. Além disso, data($pd/p1:Specifications/ Material) retorna dados de caracteres digitados como xdt:untypedAtomic, pois <Material> não é digitado. Quando a entrada não for 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>Almuminum Alloy</Material>Almuminum Alloy
</Root>
Na consulta a seguir, data($pd/p1:Features/wm:Warranty) retorna um erro estático, pois <Warranty> é um elemento do 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