Partage via


replace value of (XML DML)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance

Met à jour la valeur d'un nœud dans le document.

Syntaxe

replace value of Expression1
with Expression2

Arguments

Expression1

Identifie un nœud dont la valeur doit être mise à jour. Un seul nœud doit être désigné, Autrement dit, Expression1 doit être un singleton statique. Si le code XML est typé, le type du nœud doit être un type simple. Si plusieurs nœuds sont sélectionnés, une erreur est générée. Si Expression1 retourne une séquence vide, aucun remplacement de valeur n’a lieu et aucune erreur n’est retournée. Expression1 doit retourner un seul élément avec un contenu de type simple (type de liste ou atomique), un nœud de texte ou un nœud d’attribut. Expression1 ne peut pas être de type union, de type complexe, une instruction de traitement, un nœud de document ou un nœud de commentaire. Sinon, une erreur est retournée.

Expression2

Identifie la nouvelle valeur du nœud. Il peut s’agir d’une expression qui retourne un nœud de type simple, car data() elle est utilisée implicitement. Si la valeur est une liste de valeurs, l’instruction update remplace l’ancienne valeur par la liste. Lorsque vous modifiez une instance XML typée, Expression2 doit être le même type ou un sous-type d’Expression1. Dans le cas contraire, une erreur est retournée. Lorsque vous modifiez une instance XML non typée, Expression2 doit être une expression qui peut être atomisée. Dans le cas contraire, une erreur est retournée.

Exemples

Les exemples de code Transact-SQL de cet article sont fondés sur l’échantillon de base de données AdventureWorks2022 ou AdventureWorksDW2022 fourni, que vous pouvez télécharger à partir de la page d’accueil Échantillons et projets communautaires Microsoft SQL Server.

Les exemples suivants de l’instruction replace value of DML XML montrent comment mettre à jour des nœuds dans un document XML.

A. Remplacer des valeurs dans une instance XML

Dans l’exemple suivant, une instance de document est d’abord affectée à une variable de type xml. Ensuite, les replace value of instructions DML XML mettent à jour les valeurs dans le document.

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 cible de la mise à jour doit être, tout au plus, un nœud explicitement spécifié dans l’expression de chemin d’accès par l’ajout de « [1] » à la fin de l’expression.

B. Utiliser l’expression if pour déterminer la valeur de remplacement

Vous pouvez spécifier l’expression if dans Expression2 de l’instructionreplace value of, comme illustré dans l’exemple suivant. Expression1 identifie l’attribut LaborHours du premier centre de travail doit être mis à jour. Expression2 utilise une if expression pour déterminer la nouvelle valeur de l’attribut 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. Mettre à jour le code XML stocké dans une colonne XML non typée

L'exemple suivant met à jour du code XML dans une colonne.

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. Mettre à jour le code XML stocké dans une colonne XML typée

Cet exemple remplace des valeurs dans un document contenant des instructions de fabrication et stockées dans une colonne XML typée.

Dans l’exemple, vous créez d’abord une table (T) avec une colonne XML typée dans la AdventureWorks2022 base de données. Vous copiez ensuite une instance XML d’instructions de fabrication à partir de la Instructions colonne de la table dans la ProductModel table T. Les insertions sont ensuite appliquées au code XML dans la table 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;

Cet exemple utilise cast lors du remplacement de LotSize la valeur. cast est obligatoire lorsque la valeur doit être d’un type spécifique. Dans cet exemple, s’il s’agit 500 de la valeur, le cast explicite n’est pas nécessaire.