Método consulta() (Tipo de dados xml)

Especifica uma consulta XQuery em relação a uma instância do tipo de dados xml. O resultado é do tipo xml. O método retorna uma instância de XML sem-tipo.

Sintaxe

query ('XQuery')

Argumentos

  • XQuery
    É uma cadeia de caracteres, uma expressão XQuery, que consulta nós XML, como elementos e atributos, em uma instância XML.

Exemplos

Esta seção fornece exemplos de uso do método query() do tipo de dados xml.

A. Usando o método query() em relação a uma variável de tipo xml

O exemplo a seguir declara uma variável @myDoc do tipo xml e atribui uma instância XML a essa variável. O método query() é usado para especificar uma consulta XQuery em relação ao documento.

A consulta recupera o elemento filho <Features> do elemento <ProductDescription>:

declare @myDoc xml
set @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'
SELECT @myDoc.query('/Root/ProductDescription/Features')

Este é o resultado:

<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>      

B. Usando o método query() em relação a uma coluna do tipo XML

No seguinte exemplo, o método query() é usado para especificar uma consulta XQuery em relação à coluna CatalogDescription do tipo xml no banco de dados AdventureWorks2008R2:

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1

Observe o seguinte na consulta anterior:

  • A coluna CatalogDescription é uma coluna xml digitada. Isso significa que ela possui uma coleção de esquema associada. No Prólogo do XQuery, a palavra-chave namespace é usada para definir o prefixo que é posteriormente usado no corpo da consulta.

  • O método query() constrói o XML, um elemento <Product> que tem um atributo ProductModelID, no qual o valor do atributo ProductModelID é recuperado do banco de dados. Para obter mais informações sobre a construção de XML, consulte Construção XML (XQuery).

  • O método exist() (tipo de dados XML) na cláusula WHERE é usado para localizar somente as linhas que contêm o elemento <Warranty> no XML. Novamente, a palavra-chave namespace é usada para definir dois prefixos de namespace.

Este é o resultado parcial:

<Product ProductModelID="19"/> 
<Product ProductModelID="23"/> 
...

Observe que os métodos query() e exist() devem declarar o prefixo PD. Nesses casos, você pode usar WITH XMLNAMESPACES para definir primeiro os prefixos e usá-los na consulta.

WITH XMLNAMESPACES (
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1