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

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Realiza una XQuery en XML y devuelve un valor de tipo SQL. Este método devuelve un valor escalar.

Normalmente, este método se usa para extraer un valor de una instancia XML almacenada en una columna, un parámetro o una variable de tipo xml. De este modo, puede especificar SELECT consultas que combinen o comparen datos XML con datos en columnas no XML.

Sintaxis

value ( XQuery , SQLType )

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

XQuery

La expresión XQuery , un literal de cadena, que recupera datos dentro de la instancia XML. La expresión XQuery debe devolver un valor como máximo. En caso contrario, se devolverá un error.

SQLType

Tipo SQL preferido, un literal de cadena, que se va a devolver. El tipo de valor devuelto de este método coincide con el parámetro SQLType. SQLType no puede ser un tipo de datos xml , un tipo definido por el usuario de Common Language Runtime (CLR), image, text, ntext o sql_variant tipo de datos. SQLType puede ser un tipo de datos SQL definido por el usuario.

El value() método usa el operador Transact-SQL CONVERT implícitamente. value() intenta convertir el resultado de la expresión XQuery, la representación de cadena serializada, del tipo de definición de esquema XML (XSD) al tipo SQL correspondiente especificado por la conversión de Transact-SQL. Para obtener más información sobre las reglas de conversión de tipos para CONVERT, vea CAST y CONVERT.

Por motivos de rendimiento, puede usar exist() con sql:column() en lugar de usar el value() método en un predicado para compararlo con un valor relacional. Este exist() ejemplo se muestra más adelante en este artículo.

Ejemplos

En los ejemplos de código de Transact-SQL de este artículo se usa la AdventureWorks2022 base de datos de ejemplo, que puede descargar desde la página principal ejemplos de Microsoft SQL Server y proyectos de comunidad.

A Usar el método value() en una variable de tipo XML

En el ejemplo siguiente, una instancia XML se almacena en una variable de tipo xml . El método value() recupera el valor del atributo ProductID en el XML. A continuación, el valor se asigna a una variable int .

DECLARE @myDoc XML;
DECLARE @ProdID INT;

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>';

SET @ProdID = @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int');
SELECT @ProdID;

Como resultado, se devuelve un valor de 1 .

Aunque solo hay un ProductID atributo en la instancia XML, las reglas de escritura estáticas requieren que especifique explícitamente que la expresión de ruta de acceso devuelva un singleton. Por lo tanto, [1] se agrega al final de la expresión de ruta de acceso. Para obtener más información sobre los tipos estáticos, vea XQuery y el establecimiento de tipos estáticos.

B. Usar el método value() para recuperar un valor de una columna de tipo XML

La siguiente consulta se especifica en una columna de tipo xml (CatalogDescription) de la base de datos AdventureWorks2022. La consulta recupera los valores del atributo ProductModelID de cada instancia XML almacenada en la columna.

SELECT CatalogDescription.value(
    'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
       (/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL
ORDER BY Result DESC;

Nota de la consulta anterior:

  • Se utiliza la palabra clave namespace para definir un prefijo de espacio de nombres.

  • Según los requisitos de los tipos estáticos, se agrega [1] al final de la expresión de ruta de acceso del método value() para indicar explícitamente que la expresión de ruta de acceso devuelva un singleton.

Este es el resultado parcial:

35
34
...

C. Use los métodos value() y exist() para recuperar valores de una columna de tipo XML

En el siguiente ejemplo se muestra el uso del método value() y el método exist() del tipo de datos xml. El método value() se utiliza para recuperar los valores del atributo ProductModelID del XML. El método exist() de la cláusula WHERE se utiliza para filtrar las filas de la tabla.

La consulta recupera los identificadores de modelo de producto de las instancias XML que incluyen información de garantía (el elemento <Warranty>) entre sus características. La condición de la cláusula WHERE utiliza el método exist() para recuperar únicamente las filas que cumplan esta condición.

SELECT CatalogDescription.value(
    'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
           (/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist(
    'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";

     /PD:ProductDescription/PD:Features/wm:Warranty') = 1;

Nota de la consulta anterior:

  • La columna CatalogDescription es una columna XML con tipo. Esto significa que tiene asociada una colección de esquemas. En Modules and Prologs - XQuery Prolog , la declaración de espacio de nombres se usa para definir el prefijo que se usa más adelante en el cuerpo de la consulta.

  • Si el exist() método devuelve 1 (true), indica que la instancia XML incluye el <Warranty> elemento secundario como una de las características.

  • Después, el método value() de la cláusula SELECT recupera los valores del atributo ProductModelID como enteros.

Este es el resultado parcial:

19
23
...

D. Usar el método exist() en lugar del método value()

Por motivos de rendimiento, en lugar de utilizar el método value() de un predicado para compararlo con un valor relacional, utilice exist() con sql:column(). Por ejemplo:

CREATE TABLE T (c1 INT, c2 VARCHAR(10), c3 XML);
GO

SELECT c1, c2, c3
FROM T
WHERE c3.value('(/root/@a)[1]', 'integer') = c1;
GO

Este código se puede volver a escribir de la siguiente manera:

SELECT c1, c2, c3
FROM T
WHERE c3.exist('/root[@a=sql:column("c1")]') = 1;
GO