Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base 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 <.
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> <notxml@gt; as text </notxml> 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)