Compartir a través de


replace value of (XML DML)

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance

Actualiza el valor de un nodo en el documento.

Sintaxis

replace value of Expression1
with Expression2

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

Expression1

Identifica un nodo cuyo valor se va a actualizar. Debe identificar un solo nodo. Es decir, Expresión1 debe ser un singleton estático. Si se escribe el XML, el tipo del nodo debe ser un tipo simple. Si se seleccionan varios nodos, se producirá un error. Si Expression1 devuelve una secuencia vacía, no se reemplazará ningún valor ni se devolverá ningún error. Expression1 debe devolver un solo elemento que incluya contenido de tipo simple (tipos de lista o atómicos), un nodo de texto o un nodo de atributo. Expression1 no puede ser un tipo de unión, un tipo complejo, una instrucción de procesamiento, un nodo de documento ni un nodo de comentario, pues se devolvería un error.

Expression2

Identifica el nuevo valor del nodo. Puede ser una expresión que devuelve un nodo de tipo simple, porque data() se usa implícitamente. Si el valor es una lista de valores, la update instrucción reemplaza el valor anterior por la lista. Al modificar una instancia XML con tipo, Expression2 debe ser el mismo tipo o un subtipo de Expression1. En caso contrario, se devolverá un error. Al modificar una instancia XML sin tipo, Expression2 debe ser una expresión que se pueda atomizar. En caso contrario, se devolverá un error.

Ejemplos

Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022 o AdventureWorksDW2022, que se pueden descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.

En los ejemplos siguientes de la replace value of instrucción DML XML se muestra cómo actualizar nodos en un documento XML.

A Reemplazar valores en una instancia XML

En el ejemplo siguiente, se asigna en primer lugar una instancia de documento a una variable de tipo xml. A continuación, replace value of las instrucciones DML XML actualizan los valores del 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;

El destino que se actualiza debe ser, como máximo, un nodo que se especifica de forma explícita en la expresión de ruta de acceso agregando un "[1]" al final de la expresión.

B. Usar la expresión if para determinar el valor de reemplazo

Puede especificar la if expresión en Expression2 de la replace value of instrucción , como se muestra en el ejemplo siguiente. Expression1 identifica el LaborHours atributo del primer centro de trabajo que se va a actualizar. Expression2 usa una if expresión para determinar el nuevo valor del 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. Actualizar XML almacenado en una columna XML sin tipo

En el ejemplo siguiente se actualiza XML almacenado en una columna:

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. Actualizar XML almacenado en una columna XML con tipo

En este ejemplo se reemplazan valores de un documento de instrucciones de fabricación almacenado en una columna XML con tipo.

En el ejemplo, primero se crea una tabla (T) con una columna XML con tipo en la AdventureWorks2022 base de datos. A continuación, copie una instancia XML de instrucciones de fabricación de la Instructions columna de la ProductModel tabla en la tabla T. A continuación, las inserciones se aplican a XML en la tabla 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;

En este ejemplo se usa cast al reemplazar LotSize el valor. cast es necesario cuando el valor debe ser de un tipo específico. En este ejemplo, si 500 es el valor , la conversión explícita no es necesaria.