Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Atualiza o valor de um nó no documento.
Sintaxe
replace value of Expression1
with Expression2
Arguments
Expressão1
Identifica um nó cujo valor deve ser atualizado. Deve identificar apenas um único nó. Ou seja, a Expressão1 deve ser um singleton estático. Se o XML for tipado, o tipo do nó deve ser simples. Quando vários nós são selecionados, surge um erro. Se a Expression1 devolver uma sequência vazia, não ocorre substituição de valor nem são retornados erros. Expression1 deve devolver um único elemento que tenha conteúdo de tipo simples (tipos de lista ou atómicos), um nó de texto ou um nó de atributo. Expression1 não pode ser um tipo de união, um tipo complexo, uma instrução de processamento, um nó de documento ou um nó de comentário, ou um erro é devolvido.
Expressão2
Identifica o novo valor do nó. Pode ser uma expressão que devolve um nó tipo simples, porque data() é usada implicitamente. Se o valor for uma lista de valores, a update instrução substitui o valor antigo pela lista. Quando se modifica uma instância XML tipada, o Expression2 deve ser do mesmo tipo ou um subtipo do Expression1. Caso contrário, é devolto um erro. Quando se modifica uma instância XML não tipada, o Expression2 deve ser uma expressão que pode ser atomizada. Caso contrário, é devolto um erro.
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.
Os seguintes exemplos da replace value of instrução XML DML ilustram como atualizar nós num documento XML.
A. Substituir valores numa instância XML
No exemplo seguinte, uma instância de documento é primeiro atribuída a uma variável do tipo xml . Depois, replace value of as instruções DML XML atualizam os valores no documento.
DECLARE @myDoc XML;
SET @myDoc = '<Root>
<Location LocationID="10"
LaborHours="1.1"
MachineHours=".2" >Manufacturing steps are described here.
<step>Manufacturing step 1 at this work center</step>
<step>Manufacturing step 2 at this work center</step>
</Location>
</Root>';
SELECT @myDoc;
-- update text in the first manufacturing step
SET @myDoc.modify('
replace value of (/Root/Location/step[1]/text())[1]
with "new text describing the manu step"
');
SELECT @myDoc;
-- update attribute value
SET @myDoc.modify('
replace value of (/Root/Location/@LaborHours)[1]
with "100.0"
');
SELECT @myDoc;
O destino a ser atualizado deve ser, no máximo, um nó explicitamente especificado na expressão do caminho, adicionando um "[1]" no final da expressão.
B. Use a expressão if para determinar o valor de substituição
Pode especificar a if expressão em Expressão2 da replace value of afirmação, como mostrado no exemplo seguinte. Expression1 identifica o LaborHours atributo do primeiro centro de trabalho a atualizar.
Expression2 utiliza uma if expressão para determinar o novo valor do LaborHours atributo.
DECLARE @myDoc XML;
SET @myDoc = '<Root>
<Location LocationID="10"
LaborHours=".1"
MachineHours=".2" >Manu steps are described here.
<step>Manufacturing step 1 at this work center</step>
<step>Manufacturing step 2 at this work center</step>
</Location>
</Root>';
--SELECT @myDoc
SET @myDoc.modify('
replace value of (/Root/Location[1]/@LaborHours)[1]
with (
if (count(/Root/Location[1]/step) > 3) then
"3.0"
else
"1.0"
)
');
SELECT @myDoc;
C. Atualizar XML armazenado numa coluna XML não tipada
O seguinte exemplo atualiza o XML armazenado numa coluna:
DROP TABLE T;
GO
CREATE TABLE T (i INT, x XML);
GO
INSERT INTO T
VALUES (
1,
'<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>'
);
GO
-- verify the current <ProductDescription> element
SELECT x.query(' /Root/ProductDescription')
FROM T;
-- update the ProductName attribute value
UPDATE T
SET x.modify('
replace value of (/Root/ProductDescription/@ProductName)[1]
with "New Road Bike" ');
-- verify the update
SELECT x.query(' /Root/ProductDescription');
FROM T
D. Atualizar XML armazenado numa coluna XML tipada
Este exemplo substitui valores num documento de instruções de fabrico armazenado numa coluna XML digitada.
No exemplo, cria primeiro uma tabela (T) com uma coluna XML digitada na AdventureWorks2025 base de dados. Depois, copia-se uma instância XML de instruções de fabrico da Instructions coluna na ProductModel tabela para a tabela T. As inserções são então aplicadas a XML na tabela T.
USE AdventureWorks2022;
GO
DROP TABLE T;
GO
CREATE TABLE T (
ProductModelID INT PRIMARY KEY,
Instructions XML(Production.ManuInstructionsSchemaCollection)
);
GO
INSERT T
SELECT ProductModelID, Instructions
FROM Production.ProductModel
WHERE ProductModelID = 7;
GO
--insert a new location - <Location 1000/>.
UPDATE T
SET Instructions.modify('
declare namespace MI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
insert <MI:Location LocationID="1000" LaborHours="1000" LotSize="1000" >
<MI:step>Do something using <MI:tool>hammer</MI:tool></MI:step>
</MI:Location>
as first
into (/MI:root)[1]
');
GO
SELECT Instructions
FROM T;
GO
-- Now replace manu. tool in location 1000
UPDATE T
SET Instructions.modify('
declare namespace MI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
replace value of (/MI:root/MI:Location/MI:step/MI:tool)[1]
with "screwdriver"
');
GO
SELECT Instructions
FROM T;
-- Now replace value of lot size
UPDATE T
SET Instructions.modify('
declare namespace MI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
replace value of (/MI:root/MI:Location/@LotSize)[1]
with 500 cast as xs:decimal ?
');
GO
SELECT Instructions
FROM T;
Este exemplo é usado cast ao substituir LotSize valor.
cast é necessário quando o valor deve ser de um tipo específico. Neste exemplo, se 500 for o valor, não é necessário lançar conjuros explícitos.