Partilhar via


inserir (XML DML)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Insere um ou mais nós identificados por Expression1 como nós filhos ou irmãos do nó identificado por Expression2.

Sintaxe

insert Expression1 (  
{as first | as last} into | after | before  
Expression2  
)  

Arguments

Expressão1
Identifica um ou mais nós a inserir. Isto pode ser uma instância XML constante; uma referência a uma instância de tipo de dado XML tipado da mesma coleção XML Schema à qual o método modify está a ser aplicado; uma instância de tipo de dado XML não tipado usando uma função autónoma sql:column()/sql:variable( ); ou uma expressão XQuery. A expressão pode resultar num nó, e também num nó de texto, ou numa sequência ordenada de nós. Não pode resolver para o nó raiz (/). Se a expressão resultar num valor ou numa sequência de valores, os valores são inseridos como um único nó de texto com um espaço a separar cada valor da sequência. Se especificar múltiplos nós como constantes, os nós estão incluídos entre parênteses e separados por vírgulas. Não pode inserir sequências heterogéneas, como uma sequência de elementos, atributos ou valores. Se a Expression1 resolver para uma sequência vazia, não ocorre inserção nem são retornados erros.

em
Os nós identificados por Expression1 são inseridos como descendentes diretos (nós filhos) do nó identificado por Expression2. Se o nó no Expression2 já tiver um ou mais nós filhos, deve usar como primeiro ou como último para especificar onde quer adicionar o novo nó. Por exemplo, no início ou no final da lista filha, respetivamente. As palavras-chave as first e as last são ignoradas quando os atributos são inseridos.

after
Os nós identificados por Expression1 são inseridos como irmãos diretamente após o nó identificado por Expression2. A palavra-chave after não pode ser usada para inserir atributos. Por exemplo, não pode ser usado para inserir um construtor de atributos ou para devolver um atributo de um XQuery.

before
Os nós identificados por Expression1 são inseridos como irmãos diretamente antes do nó identificado por Expression2. A palavra-chave antes não pode ser usada quando os atributos estão a ser inseridos. Por exemplo, não pode ser usado para inserir um construtor de atributos ou para devolver um atributo de um XQuery.

Expressão2
Identifica um nó. Os nós identificados em Expressão1 são inseridos em relação ao nó identificado por Expressão2. Isto pode ser uma expressão XQuery que devolve uma referência a um nó que existe no documento atualmente referenciado. Se mais do que um nó for devolvido, o inserto falha. Se o Expression2 devolver uma sequência vazia, não ocorre inserção nem são devolvidos erros. Se o Expression2 não for estaticamente um singleton, é devolvedo um erro estático. Expression2 não pode ser uma instrução de processamento, comentário ou atributo. Note que o Expression2 deve ser uma referência a um nó existente no documento e não a um nó construído.

Examples

A. Inserir nós de elemento no documento

O exemplo seguinte ilustra como inserir elementos num documento. Primeiro, um documento XML é atribuído a uma variável do tipo xml . Depois, através de várias instruções XML DML, o exemplo ilustra como os nós de elemento são inseridos no documento. Após cada inserção, a instrução SELECT mostra o resultado.

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>Aluminum</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  

Note-se que várias expressões de caminho neste exemplo especificam "[1]" como requisito de tipagem per-estática. Isto garante um nó alvo único.

B. Inserir múltiplos elementos no documento

No exemplo seguinte, um documento é primeiro atribuído a uma variável do tipo xml . Depois, uma sequência de dois elementos, representando características do produto, é atribuída a uma segunda variável do tipo xml . Esta sequência é então inserida na primeira variável.

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. Inserir atributos num documento

O exemplo seguinte ilustra como os atributos são inseridos num documento. Primeiro, um documento é atribuído a uma variável do tipo xml . Depois, uma série de instruções XML DML inseridas é usada para inserir atributos no documento. Após cada inserção de atributo, a instrução SELECT mostra o resultado.

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 retrieved 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. Inserir um nó de comentário

Nesta consulta, um documento XML é primeiro atribuído a uma variável do tipo xml . Depois, o DML XML é usado para inserir um nó de comentário após o primeiro <step> elemento.

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. Inserir uma instrução de processamento

Na consulta seguinte, um documento XML é primeiro atribuído a uma variável do tipo xml . Depois, a palavra-chave XML DML é usada para inserir uma instrução de processamento no início do documento.

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. Inserção de dados usando uma secção CDATA

Quando insere texto que inclui caracteres que não são válidos em XML, como < ou >, pode usar secções CDATA para inserir os dados, conforme mostrado na consulta seguinte. A consulta especifica uma secção CDATA, mas esta é adicionada como um nó de texto com quaisquer caracteres inválidos convertidos em entidades. Por exemplo, < é guardado como &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  

A consulta insere um nó de texto no <Features> elemento:

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

G. Inserir nó de texto

Nesta consulta, um documento XML é primeiro atribuído a uma variável do tipo xml . Depois, o DML XML é usado para inserir um nó de texto como primeiro filho do <Root> elemento. O construtor de texto é usado para especificar o texto.

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. Inserir um novo elemento numa coluna xml não tipada

O exemplo seguinte aplica XML DML para atualizar uma instância XML armazenada numa coluna de tipo xml :

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>Aluminum</Material> as first  
  into   (/Root/ProductDescription/Features)[1]  
');  
GO  

Mais uma vez, quando o <Material> nó elemento é inserido, a expressão do caminho deve devolver um único alvo. Isto é explicitamente especificado adicionando um [1] no final da expressão.

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

I. Inserir com base numa instrução if condition

No exemplo seguinte, uma condição IF é especificada como parte da Expressão1 na instrução XML DML inserida . Se a condição for Verdadeira, um atributo é adicionado ao <WorkCenter> elemento.

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  

O exemplo seguinte é semelhante, exceto que a instrução XML DML insere um elemento no documento se a condição for Verdadeira. Isto é, se o <WorkCenter> elemento tiver menos ou for igual a dois <step> elementos filhos.

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  

Este é o resultado:

<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. Inserir nós numa coluna xml tipada

Este exemplo insere um elemento e um atributo numa instrução de fabrico em XML armazenada numa coluna xml tipada.

No exemplo, cria primeiro uma tabela (T) com uma coluna xml tipada, na base de dados AdventureWorks. Depois, copia-se uma instância XML de instruções de fabrico da coluna Instruções na tabela ProductModel para a tabela T. As inserções são então aplicadas ao XML na tabela 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             

Ver também

Comparar XML digitado com XML não tipado
Criar instâncias de dados XML
Métodos de Tipos de Dados XML
Linguagem de Modificação de Dados XML (XML DML)