insert (XML DML)insert (XML DML)

Se aplica a:Applies to: síSQL ServerSQL Server (todas las versiones admitidas) yesSQL ServerSQL Server (all supported versions) SíAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL DatabaseSe aplica a:Applies to: síSQL ServerSQL Server (todas las versiones admitidas) yesSQL ServerSQL Server (all supported versions) SíAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database

Inserta uno o más nodos identificados por Expression1 como nodos secundarios o del mismo nivel que el nodo identificado por Expression2.Inserts one or more nodes identified by Expression1 as child nodes or siblings of the node identified by Expression2.

SintaxisSyntax

insert Expression1 (  
{AS first | AS last} INTO | AFTER | BEFORE  
Expression2  
)  

Nota

Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

ArgumentosArguments

Expression1Expression1
Identifica uno o varios nodos que se van a insertar.Identifies one or more nodes to insert. Puede ser una instancia XML constante; una referencia a una instancia del tipo de datos XML con tipo de la misma colección de esquemas XML en la que se aplica el método modify; una instancia del tipo de datos XML sin tipo que usa una función sql:column() /sql:variable() independiente; o una expresión XQuery.This can be a constant XML instance; a reference to a typed XML data type instance of the same XML Schema collection on which the modify method is being applied; an untyped XML data type instance using a stand-alone sql:column()/sql:variable() function; or an XQuery expression. La expresión puede proporcionar un nodo, y también un nodo de texto, o una secuencia ordenada de nodos.The expression can result in a node, and also a text node, or in an ordered sequence of nodes. No se puede resolver en el nodo raíz (/).It cannot resolve to the root (/) node. Si la expresión da como resultado un valor o una secuencia de valores, los valores se insertan como un solo nodo de texto y cada valor de la secuencia se separa con un espacio.If the expression results in a value or a sequence of values, the values are inserted as a single text node with a space separating each value in the sequence. Si se especifican varios nodos como constante, los nodos se incluyen entre paréntesis y se separan mediante comas.If you specify multiple nodes as constant, the nodes are included in parentheses and are separated by commas. No es posible insertar secuencias heterogéneas, como una secuencia de elementos, atributos o valores.You cannot insert heterogeneous sequences such as a sequence of elements, attributes, or values. Si Expression1 se resuelve en una secuencia vacía, no se produce ninguna inserción ni se devuelven errores.If Expression1 resolves to an empty sequence, no insertion occurs and no errors are returned.

intointo
Los nodos identificados por Expression1 se insertan como descendientes directos (nodos secundarios) del nodo identificado por Expression2.Nodes identified by Expression1 are inserted as direct descendents (child nodes) of the node identified by Expression2. Si el nodo de Expression2 ya tiene uno o más nodos secundarios, se debe usar as first o as last para especificar dónde se quiere agregar el nuevo nodo.If the node in Expression2 already has one or more child nodes, you must use either as first or as last to specify where you want the new node added. Se agregaría al principio o al final de la lista de nodos secundarios respectivamente.For example, at the start or at the end of the child list, respectively. Las palabras clave as first y as last se omiten cuando se insertan atributos.The as first and as last keywords are ignored when attributes are inserted.

afterafter
Los nodos identificados por Expression1 se insertan como nodos del mismo nivel justo después del nodo identificado por Expression2.Nodes identified by Expression1 are inserted as siblings directly after the node identified by Expression2. La palabra clave after no se puede usar para insertar atributos.The after keyword cannot be used to insert attributes. Por ejemplo, no se puede utilizar para insertar un constructor de atributos o devolver un atributo desde una consulta XQuery.For example, it cannot be used to insert an attribute constructor or to return an attribute from an XQuery.

beforebefore
Los nodos identificados por Expression1 se insertan como nodos del mismo nivel justo antes del nodo identificado por Expression2.Nodes identified by Expression1 are inserted as siblings directly before the node identified by Expression2. La palabra clave before no se puede usar cuando se insertan atributos.The before keyword cannot be used when attributes are being inserted. Por ejemplo, no se puede utilizar para insertar un constructor de atributos o devolver un atributo desde una consulta XQuery.For example, it cannot be used to insert an attribute constructor or to return an attribute from an XQuery.

Expression2Expression2
Identifica un nodo.Identifies a node. Los nodos identificados en Expression1 se insertan con respecto al nodo identificado por Expression2.The nodes identified in Expression1 are inserted relative to the node identified by Expression2. Puede ser una expresión XQuery que devuelva una referencia a un nodo que exista en el documento al que se hace referencia actualmente.This can be an XQuery expression that returns a reference to a node that exists in the currently referenced document. Si se devuelve más de un nodo, se produce un error en la operación de inserción.If more than one node is returned, the insert fails. Si Expression2 devuelve una secuencia vacía, no se produce ninguna inserción ni se devuelven errores.If Expression2 returns an empty sequence, no insertion occurs and no errors are returned. Si Expression2 no es un singleton de manera estática, se devuelve un error estático.If Expression2 is statically not a singleton, a static error is returned. Expression2 no puede ser una instrucción de procesamiento, un comentario ni un atributo.Expression2 cannot be a processing instruction, comment, or attribute. Tenga en cuenta que Expression2 debe ser una referencia a un nodo existente en el documento y no a un nodo construido.Note that Expression2 must be a reference to an existing node in the document and not a constructed node.

EjemplosExamples

A.A. Insertar nodos de elemento en el documentoInserting element nodes into the document

En el siguiente ejemplo se muestra cómo insertar elementos en un documento.The following example illustrates how to insert elements into a document. Primero, se asigna un documento XML a una variable de tipo xml.First, an XML document is assigned to a variable of xml type. Después, por medio de varias instrucciones insert XML DML, se muestra cómo se insertan nodos de elemento en el documento.Then, through several insert XML DML statements, the example illustrates how element nodes are inserted in the document. Después de cada inserción, la instrucción SELECT muestra el resultado.After each insert, the SELECT statement displays the result.

USE AdventureWorks;  
GO  
DECLARE @myDoc XML;         
SET @myDoc = '<Root>         
    <ProductDescription ProductID="1" ProductName="Road Bike">         
        <Features>         
        </Features>         
    </ProductDescription>         
</Root>'  ;       
SELECT @myDoc;     
-- insert first feature child (no need to specify as first or as last)         
SET @myDoc.modify('         
INSERT <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>   
INTO (/Root/ProductDescription/Features)[1]') ;  
SELECT @myDoc ;        
-- insert second feature. We want this to be the first in sequence so use 'as first'         
SET @myDoc.modify('         
INSERT <Warranty>1 year parts and labor</Warranty>          
AS first         
INTO (/Root/ProductDescription/Features)[1]         
')  ;       
SELECT @myDoc  ;       
-- insert third feature child. This one is the last child of <Features> so use 'as last'         
SELECT @myDoc         
SET @myDoc.modify('         
INSERT <Material>Aluminium</Material>          
AS last         
INTO (/Root/ProductDescription/Features)[1]         
')         
SELECT @myDoc ;        
-- Add fourth feature - this time as a sibling (and not a child)         
-- 'after' keyword is used (instead of as first or as last child)         
SELECT @myDoc  ;       
SET @myDoc.modify('         
INSERT <BikeFrame>Strong long lasting</BikeFrame>   
AFTER (/Root/ProductDescription/Features/Material)[1]         
')  ;       
SELECT @myDoc;  
GO  

Tenga en cuenta que diversas expresiones de ruta de acceso de este ejemplo especifican "[1]" como requisito para los tipos estáticos.Note that various path expressions in this example specify "[1]" as a per-static typing requirement. De esta manera se garantiza que hay un único nodo de destino.This ensures a single target node.

B.B. Insertar varios elementos en el documentoInserting multiple elements into the document

En el ejemplo siguiente, primero se asigna un documento a una variable de tipo xml.In the following example, a document is first assigned to a variable of xml type. Luego se asigna una secuencia de dos elementos que representan las características del producto a una segunda variable de tipo xml.Then, a sequence of two elements, representing product features, is assigned to a second variable of xml type. Después, esta secuencia se inserta en la primera variable.This sequence is then inserted into the first variable.

USE AdventureWorks;  
GO  
DECLARE @myDoc XML;  
SET @myDoc = N'<Root>             
<ProductDescription ProductID="1" ProductName="Road Bike">             
    <Features> </Features>             
</ProductDescription>             
</Root>';  
DECLARE @newFeatures xml;  
SET @newFeatures = N'<Warranty>1 year parts and labor</Warranty>            
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>';           
-- insert new features from specified variable            
SET @myDoc.modify('             
insert sql:variable("@newFeatures")             
into (/Root/ProductDescription/Features)[1] ')             
SELECT @myDoc;  
GO  

C.C. Insertar atributos en un documentoInserting attributes into a document

En el ejemplo siguiente se muestra cómo se insertan los atributos en un documento.The following example illustrates how attributes are inserted in a document. Primero, se asigna un documento a una variable de tipo xml.First, a document is assigned to an xml type variable. Después, se usa una serie de instrucciones insert XML DML para insertar atributos en el documento.Then, a series of insert XML DML statements is used to insert attributes into the document. Después de cada inserción de atributo, la instrucción SELECT muestra el resultado.After each attribute insertion, the SELECT statement displays the result.

USE AdventureWorks;  
GO  
DECLARE @myDoc XML;            
SET @myDoc =   
'<Root>             
    <Location LocationID="10" >             
        <step>Manufacturing step 1 at this work center</step>             
        <step>Manufacturing step 2 at this work center</step>             
    </Location>             
</Root>' ;  
SELECT @myDoc;          
-- insert LaborHours attribute             
SET @myDoc.modify('             
insert attribute LaborHours {".5" }             
into (/Root/Location[@LocationID=10])[1] ');           
SELECT @myDoc;          
-- insert MachineHours attribute but its value is retrived from a sql variable @Hrs             
DECLARE @Hrs FLOAT;            
SET @Hrs =.2;          
SET @myDoc.modify('             
insert attribute MachineHours {sql:variable("@Hrs") }             
into   (/Root/Location[@LocationID=10])[1] ');            
SELECT @myDoc;             
-- insert sequence of attribute nodes (note the use of ',' and ()              
-- around the attributes.             
SET @myDoc.modify('             
insert (              
           attribute SetupHours {".5" },             
           attribute SomeOtherAtt {".2"}             
        )             
INTO (/Root/Location[@LocationID=10])[1] ');             
SELECT @myDoc;  
GO  

D.D. Insertar un nodo de comentarioInserting a comment node

En esta consulta primero se asigna un documento XML a una variable de tipo xml.In this query, an XML document is first assigned to a variable of xml type. Después, se utiliza XML DML para insertar un nodo de comentario detrás del primer elemento <step>.Then, XML DML is used to insert a comment node after the first <step> element.

USE AdventureWorks;  
GO  
DECLARE @myDoc XML;             
SET @myDoc =   
'<Root>             
    <Location LocationID="10" >             
        <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('             
insert <!-- some comment -->             
after (/Root/Location[@LocationID=10]/step[1])[1] ');            
SELECT @myDoc;  
GO  

E.E. Insertar una instrucción de procesamientoInserting a processing instruction

En la consulta siguiente primero se asigna un documento XML a una variable de tipo xml.In the following query, an XML document is first assigned to a variable of xml type. Después, se utiliza la palabra clave XML DML para insertar una instrucción de procesamiento al principio del documento.Then, the XML DML keyword is used to insert a processing instruction at the start of the document.

USE AdventureWorks;  
GO  
DECLARE @myDoc XML;  
SET @myDoc =   
'<Root>   
    <Location LocationID="10" >   
        <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('   
insert <?Program = "Instructions.exe" ?>   
before (/Root)[1] ') ;  
SELECT @myDoc ;  
GO  

F.F. Insertar datos mediante una sección CDATAInserting data using a CDATA section

Cuando se inserta texto que incluye caracteres que no son válidos en XML, como < o >, se pueden utilizar secciones CDATA para insertar los datos, como se muestra en la consulta siguiente.When you insert text that includes characters that are not valid in XML, such as < or >, you can use CDATA sections to insert the data as shown in the following query. La consulta especifica una sección CDATA, pero se agrega como un nodo de texto con los caracteres no válidos convertidos en entidades.The query specifies a CDATA section, but it is added as a text node with any invalid characters converted to entities. Por ejemplo, < se guarda como &lt;.For example, < is saved as &lt;.

USE AdventureWorks;  
GO  
DECLARE @myDoc XML;             
SET @myDoc =   
'<Root>             
    <ProductDescription ProductID="1" ProductName="Road Bike">             
        <Features> </Features>             
    </ProductDescription>             
</Root>' ;            
SELECT @myDoc ;            
SET @myDoc.modify('             
insert <![CDATA[ <notxml> as text </notxml> or cdata ]]>   
into  (/Root/ProductDescription/Features)[1] ') ;   
SELECT @myDoc ;  
GO  

La consulta inserta un nodo de texto en el elemento <Features>:The query inserts a text node into the <Features> element:

<Root>  
<ProductDescription ProductID="1" ProductName="Road Bike">  
<Features> &lt;notxml@gt; as text &lt;/notxml&gt; or cdata </Features>  
</ProductDescription>  
</Root>       

G.G. Insertar un nodo de textoInserting text node

En esta consulta primero se asigna un documento XML a una variable de tipo xml.In this query, an XML document is first assigned to a variable of xml type. Después, se utiliza XML DML para insertar un nodo de texto como el primer elemento secundario del elemento <Root>.Then, XML DML is used to insert a text node as the first child of the <Root> element. Para especificar el texto se utiliza el constructor de texto.The text constructor is used to specify the text.

USE AdventureWorks;  
GO  
DECLARE @myDoc XML;  
SET @myDoc = '<Root>  
<ProductDescription ProductID="1" ProductName="Road Bike">  
<Features>  
  
</Features>  
</ProductDescription>  
</Root>'  
SELECT @myDoc;  
SET @myDoc.modify('  
 insert text{"Product Catalog Description"}   
 as first into (/Root)[1]  
');  
SELECT @myDoc;  

H.H. Insertar un nuevo elemento en una columna xml sin tipoInserting a new element into an untyped xml column

En el ejemplo siguiente se usa XML DML para actualizar una instancia XML almacenada en una columna de tipo xml:The following example applies XML DML to update an XML instance stored in an xml type column:

USE AdventureWorks;  
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  
-- insert a new element  
UPDATE T  
SET x.modify('insert <Material>Aluminium</Material> as first  
  into   (/Root/ProductDescription/Features)[1]  
');  
GO  

De nuevo, cuando se inserta el nodo de elemento <Material>, la expresión de ruta de acceso debe devolver un único destino.Again, when the <Material> element node is inserted, the path expression must return a single target. Esto se especifica explícitamente al agregar [1] al final de la expresión.This is explicitly specified by adding a [1] at the end of the expression.

-- check the update  
SELECT x.query(' //ProductDescription/Features')  
FROM T;  
GO  

I.I. Inserción basada en una instrucción de condición IFInserting based on an if condition statement

En el ejemplo siguiente se especifica una condición IF como parte de Expression1 en la instrucción insert XML DML.In the following example, an IF condition is specified as part of Expression1 in the insert XML DML statement. Si la condición es True, se agrega un atributo al elemento <WorkCenter>.If the condition is True, an attribute is added to the <WorkCenter> element.

USE AdventureWorks;  
GO  
DECLARE @myDoc XML;  
SET @myDoc =   
'<Root>  
    <Location LocationID="10" LaborHours="1.2" >  
        <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('  
insert  
if (/Root/Location[@LocationID=10])  
then attribute MachineHours {".5"}  
else ()  
    as first into   (/Root/Location[@LocationID=10])[1] ');  
SELECT @myDoc;  
GO  

El ejemplo siguiente es similar, con la diferencia de que la instrucción insert XML DML inserta un elemento en el documento si la condición es True.The following example is similar, except that the insert XML DML statement inserts an element in the document if the condition is True. En otras palabras, si el elemento <WorkCenter> tiene dos elementos secundarios <step> o menos.That is, if the <WorkCenter> element has less than or is equal to two <step> child elements.

USE AdventureWorks;  
GO  
DECLARE @myDoc XML;  
SET @myDoc =   
'<Root>  
    <Location LocationID="10" LaborHours="1.2" >  
        <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('  
insert  
if (count(/Root/Location/step) <= 2)  
then element step { "This is a new step" }  
else ()  
    as last into   (/Root/Location[@LocationID=10])[1] ');  
SELECT @myDoc;  
GO  

El resultado es el siguiente:This is the result:

<Root>  
 <WorkCenter WorkCenterID="10" LaborHours="1.2">  
  <step>Manufacturing step 1 at this work center</step>  
  <step>Manufacturing step 2 at this work center</step>  
  <step>This is a new step</step>  
 </WorkCenter>  

J.J. Insertar nodos en una columna xml con tipoInserting nodes in a typed xml column

En este ejemplo se insertan un elemento y un atributo en un XML de instrucciones de fabricación almacenado en una columna xml con tipo.This example inserts an element and an attribute into a manufacturing instructions XML stored in a typed xml column.

En el ejemplo, primero se crea una tabla (T) con una columna xml con tipo en la base de datos AdventureWorks.In the example, you first create a table (T) with a typed xml column, in the AdventureWorks database. A continuación, se copia en la tabla T una instancia XML con instrucciones de fabricación procedentes de la columna Instructions de la tabla ProductModel. Después se aplican las inserciones a XML en la tabla T.You then copy a manufacturing instructions XML instance from the Instructions column in the ProductModel table into table T. Insertions are then applied to XML in table T.

USE AdventureWorks;  
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             
SELECT Instructions             
FROM T;  
-- now insertion begins             
--1) insert a new manu. Location. The <Root> specified as              
-- expression 2 in the insert() must be singleton.      
UPDATE T   
SET Instructions.modify('   
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";   
insert <MI:Location LocationID="1000" >   
           <MI:step>New instructions go here</MI:step>   
         </MI:Location>   
as first   
into   (/MI:root)[1]   
') ;  
  
SELECT Instructions             
FROM T ;  
-- 2) insert attributes in the new <Location>             
UPDATE T             
SET Instructions.modify('             
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";             
insert attribute LaborHours { "1000" }             
into (/MI:root/MI:Location[@LocationID=1000])[1] ');   
GO             
SELECT Instructions             
FROM T ;  
GO             
--cleanup             
DROP TABLE T ;  
GO             

Consulte tambiénSee Also

Comparar XML con tipo y XML sin tipo Compare Typed XML to Untyped XML
Crear instancias de datos XML Create Instances of XML Data
métodos del tipo de datos xml xml Data Type Methods
Lenguaje de manipulación de datos XML (XML DML)XML Data Modification Language (XML DML)