Partilhar via


Método Value() (Tipo de Dado XML)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Executa um XQuery contra XML e devolve um valor do tipo SQL. Este método devolve um valor escalar.

Normalmente utiliza-se este método para extrair um valor de uma instância XML armazenada numa coluna, parâmetro ou variável do tipo xml . Desta forma, pode especificar SELECT consultas que combinam ou comparam dados XML com dados em colunas não XML.

Sintaxe

value ( XQuery , SQLType )

Arguments

XQuery

A expressão XQuery , um literal de cadeia, que recupera dados dentro da instância XML. O XQuery deve devolver no máximo um valor. Caso contrário, é devolto um erro.

SQLType

O tipo SQL preferido, um literal de cadeia, a ser devolvido. O tipo de retorno deste método corresponde ao parâmetro SQLType . O SQLType pode ser um tipo de dado SQL definido pelo utilizador.

Observação

O SQLType não pode ser um dos seguintes tipos de dados: xml, imagem, texto, ntext, sql_variant, ou um tipo definido pelo utilizador em common language runtime (CLR).

O value() método utiliza o operador Transact-SQL CONVERT implicitamente. value() tenta converter o resultado da expressão XQuery, a representação serializada de cadeias, do tipo XML Schema Definition (XSD) para o tipo SQL correspondente especificado por Transact-SQL conversão. Para mais informações sobre regras de conjuração de tipos para CONVERT, veja CAST e CONVERT.

Por razões de desempenho, pode usar exist() com sql:column() em vez de usar o value() método num predicado, para comparar com um valor relacional. Este exist() exemplo é mostrado mais adiante neste artigo.

Examples

Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.

A. Use o método value() contra uma variável do tipo XML

No exemplo seguinte, uma instância XML é armazenada numa variável do tipo xml . O value() método recupera o ProductID valor do atributo do XML. O valor é então atribuído a uma variável 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;

Um valor de 1 é devolvido como resultado.

Embora haja apenas um ProductID atributo na instância XML, as regras de tipagem estática exigem que especifique explicitamente que a expressão path devolve um singleton. Portanto, o [1] é adicionado ao final da expressão do caminho. Para mais informações sobre tipagem estática, consulte XQuery e Tipagem Estática.

B. Use o método value() para recuperar um valor inteiro de uma coluna de tipo XML

A consulta seguinte é especificada contra uma coluna do tipo xml (CatalogDescription) na AdventureWorks2025 base de dados. A consulta recupera ProductModelID valores de atributos de cada instância XML armazenada na coluna.

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 da consulta anterior:

  • A namespace palavra-chave é usada para definir um prefixo de namespace.

  • De acordo com os requisitos de tipagem estática, [1] é adicionado no final da expressão path no value() método para indicar explicitamente que a expressão path retorna um singleton.

Aqui está o conjunto de resultados.

35
34
28
25
23
19

C. Use o método value() para recuperar um valor de cadeia de caracteres de uma coluna de tipo XML

A consulta seguinte é especificada na coluna do tipo xml (CatalogDescription) na AdventureWorks2025 base de dados. A consulta recupera ProductModelName valores de atributos de cada instância XML armazenada na coluna.

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

Nota da consulta anterior:

  • A namespace palavra-chave é usada para definir um prefixo de namespace.

  • De acordo com os requisitos de tipagem estática, [1] é adicionado no final da expressão path no value() método para indicar explicitamente que a expressão path retorna um singleton.

Aqui está o conjunto de resultados.

Touring-2000
Touring-1000
Road-450
Road-150
Mountain-500
Mountain 100

D. Use os métodos value() e exist() para recuperar valores de uma coluna de tipo XML

O exemplo seguinte mostra o uso tanto do value() método como do método exist() do tipo de dados xml . O value() método é usado para recuperar ProductModelID valores de atributos a partir do XML. O exist() método na WHERE cláusula é usado para filtrar as linhas da tabela.

A consulta recupera IDs de modelos de produto a partir de instâncias XML que incluem informações de garantia (o <Warranty> elemento) como uma das funcionalidades. A condição na WHERE cláusula usa o exist() método para recuperar apenas as linhas que satisfazem esta condição.

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 da consulta anterior:

  • A CatalogDescription coluna é uma coluna XML tipada. Isto significa que tem uma coleção de esquemas associada. No Prolog Modules and Prologs - XQuery, a declaração do espaço de nomes é usada para definir o prefixo que será usado mais tarde no corpo da consulta.

  • Se o exist() método devolver 1 (verdadeiro), indica que a instância XML inclui o <Warranty> elemento filho como uma das funcionalidades.

  • O value() método na SELECT cláusula recupera então os ProductModelID valores dos atributos como inteiros.

Eis o resultado parcial:

19
23
...

E. Use o método existir() em vez do método value()

Por razões de desempenho, em vez de usar o value() método num predicado para comparar com um valor relacional, use exist() com sql:column(). Por exemplo:

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 pode ser reescrito da seguinte forma:

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