Partilhar via


substituir o valor de (XML DML)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase 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.