Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base 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
namespacepalavra-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 novalue()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
namespacepalavra-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 novalue()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
CatalogDescriptioncoluna é 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 devolver1(verdadeiro), indica que a instância XML inclui o<Warranty>elemento filho como uma das funcionalidades.O
value()método naSELECTcláusula recupera então osProductModelIDvalores 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