Condividi tramite


replace value of (XML DML)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure

Aggiorna il valore di un nodo nel documento.

Sintassi

replace value of Expression1
with Expression2

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere Documentazione delle versioni precedenti.

Argomenti

Expression1

Identifica un nodo di cui è necessario aggiornare il valore. Deve identificare solo un singolo nodo, ovvero Expression1 deve essere un singleton statico. Se il codice XML è tipizzato, il tipo del nodo deve essere un tipo semplice. Quando vengono selezionati più nodi, viene generato un errore. Se Expression1 restituisce una sequenza vuota, non viene eseguita alcuna sostituzione di valori e non vengono restituiti errori. Expression1 deve restituire un singolo elemento con contenuto di tipo semplice (tipo elenco o atomico), un nodo di testo o un nodo di attributo. Expression1 non può essere un tipo unione, un tipo complesso, un'istruzione di elaborazione, un nodo di documento o un nodo di commento. In caso contrario verrà restituito un errore.

Expression2

Identifica il nuovo valore del nodo. Può essere un'espressione che restituisce un nodo di tipo semplice, perché data() viene usato in modo implicito. Se il valore è un elenco di valori, l'istruzione update sostituisce il valore precedente con l'elenco. Quando si modifica un'istanza XML tipizzata, Expression2 deve essere lo stesso tipo o un sottotipo di Expression1. In caso contrario, viene restituito un errore. Quando si modifica un'istanza XML non tipizzata, Expression2 deve essere un'espressione che può essere atomizzata. In caso contrario, viene restituito un errore.

Esempi

Gli esempi di codice Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022 o AdventureWorksDW2022, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.

Negli esempi seguenti dell'istruzione replace value of XML DML viene illustrato come aggiornare i nodi in un documento XML.

R. Sostituire i valori in un'istanza XML

Nell'esempio seguente, viene assegnata prima un'istanza di documento a una variabile di tipo xml. replace value of Le istruzioni XML DML aggiornano quindi i valori nel 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;

La destinazione da aggiornare deve essere al massimo un singolo nodo specificato in modo esplicito nell'espressione di percorso aggiungendo "[1]" alla fine dell'espressione.

B. Usare l'espressione if per determinare il valore di sostituzione

È possibile specificare l'espressione if in Expression2 dell'istruzione replace value of , come illustrato nell'esempio seguente. Expression1 identifica l'attributo LaborHours dal primo centro di lavoro da aggiornare. Expression2 usa un'espressione if per determinare il nuovo valore dell'attributo LaborHours .

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. Aggiornare xml archiviato in una colonna XML non tipizzata

Nell'esempio seguente viene aggiornata un'istanza XML archiviata in una colonna:

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. Aggiornare xml archiviato in una colonna XML tipizzata

In questo esempio, vengono sostituiti i valori di un documento di istruzioni di produzione archiviato in una colonna XML tipizzata.

Nell'esempio viene innanzitutto creata una tabella (T) con una colonna XML tipizzata nel AdventureWorks2022 database. Copiare quindi un'istanza XML di istruzioni di produzione dalla Instructions colonna nella ProductModel tabella nella tabella T. Gli inserimenti vengono quindi applicati a XML nella tabella 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;

In questo esempio viene usato quando si cast sostituisce LotSize il valore. cast è obbligatorio quando il valore deve essere di un tipo specifico. In questo esempio, se 500 è il valore , il cast esplicito non è necessario.