Compartir a través de


query() (método de tipo de datos xml)

Especifica una expresión XQuery para una instancia de tipo de datos xml. El resultado es de tipo xml. El método devuelve una instancia XML sin tipo.

Sintaxis

query ('XQuery')

Argumentos

  • XQuery
    Es una cadena, una expresión XQuery, que consulta nodos XML como, por ejemplo, elementos y atributos, en una instancia XML.

Ejemplos

Esta sección muestra ejemplos de cómo utilizar el método query() de tipo de datos xml.

A. Usar el método query() con una variable de tipo xml

El ejemplo siguiente declara una variable @myDoc de tipo xml y le asigna una instancia XML. A continuación, se utiliza el método query() para especificar una expresión XQuery para el documento.

La consulta recupera el elemento secundario <Features> del 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')

El resultado es el siguiente:

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

B. Usar el método query() con una columna de tipo XML

En el ejemplo siguiente, el método query() se utiliza para especificar una expresión XQuery para la columna CatalogDescription de tipo xml en la base de datos AdventureWorks:

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 lo siguiente en la consulta anterior:

  • La columna CatalogDescription es una columna xml con tipo. Esto quiere decir que tiene asociada una colección de esquemas. En el prólogo de XQuery, la palabra clave namespace se utiliza para definir el prefijo que se utilizará posteriormente en el cuerpo de la consulta.

  • El método query() crea XML, un elemento <Product> que tiene el atributo ProductModelID, en el que el valor de atributo ProductModelID se recupera a partir de la base de datos. Para obtener más información acerca de la creación de XML, vea Construcción de XML (XQuery).

  • El método exist() del tipo de datos xml en la cláusula WHERE se utiliza para buscar sólo filas que contengan el elemento <Warranty> en el XML. La palabra clave namespace se utiliza nuevamente para definir dos prefijos de espacios de nombres.

Éste es el resultado parcial:

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

Observe que ambos métodos, query() y exist(), declaran el prefijo PD. En estos casos, puede utilizar WITH XMLNAMESPACES para definir los prefijos en primer lugar y utilizarlo en la 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