replace value of (XML DML)
Aggiorna il valore di un nodo nel documento.
Sintassi
replace value of
Expression1
with
Expression2
Argomenti
Expression1
Identifica un nodo di cui è necessario aggiornare il valore. Deve identificare solo un singolo nodo, ovvero Expression1 deve essere un singleton statico. Se l'istanza XML è tipizzata, il nodo deve essere di tipo semplice. Nel caso in cui vengano selezionati più nodi, viene restituito un errore. Se Expression1 restituisce una sequenza vuota, non viene eseguita alcuna sostituzione di valori e non vengono restituiti errori. Expression1 deve restituire un singolo elemento con contenuto a tipizzazione semplice (tipo elenco o atomico), un nodo di testo o un nodo di attributo. Expression1 non deve essere un tipo unione, un tipo complesso, un'istruzione di elaborazione, un nodo di documento o un nodo di commento. In caso contrario, viene restituito un errore.Expression2
Identifica il nuovo valore del nodo. Può trattarsi di un'espressione che restituisce un nodo con tipizzazione semplice, in quanto data() verrà utilizzato in modo implicito. Se il valore è un elenco di valori, l'istruzione update sostituisce il valore precedente con l'elenco. In caso di modifica di un'istanza XML tipizzata, Expression2 deve essere dello stesso tipo o sottotipo di Expression1. In caso contrario, viene restituito un errore. In caso di modifica di un'istanza XML non tipizzata, Expression2 deve essere un'espressione che è possibile atomizzare. In caso contrario, viene restituito un errore.
Esempi
Negli esempi seguenti di istruzione XML DML replace value of viene illustrata la modalità di aggiornamento dei nodi in un documento XML.
A. Sostituzione di valori in un'istanza XML
Nell'esempio seguente, viene assegnata innanzitutto un'istanza di documento a una variabile di tipo xml. Successivamente, le istruzioni XML DML replace value of aggiornano i valori nel 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
Si noti che la destinazione da aggiornare deve essere al massimo un singolo nodo specificato in modo esplicito nell'espressione di percorso aggiungendo "[1]" alla fine dell'espressione.
B. Utilizzo dell'espressione if per determinare il valore di sostituzione
È possibile specificare l'espressione if in Expression2 all'interno dell'istruzione XML DML replace value of, come illustrato nell'esempio seguente. Expression1 indica che l'attributo LaborHours del primo centro di lavorazione deve essere aggiornato. Expression2 utilizza un'espressione if per determinare il nuovo valore dell'attributo 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. Aggiornamento di un'istanza XML archiviata in una colonna XML non tipizzata
Nell'esempio seguente viene aggiornata un'istanza XML archiviata in una colonna:
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. Aggiornamento di un'istanza XML archiviata in una colonna XML tipizzata
In questo esempio, vengono sostituiti i valori di un documento di istruzioni di produzione archiviato in una colonna XML tipizzata.
Innanzitutto, viene creata una tabella (T) con una colonna XML tipizzata nel database AdventureWorks2008R2. Successivamente, viene copiata un'istanza XML delle istruzioni di produzione dalla colonna Instructions della tabella ProductModel nella tabella T. Quindi, gli inserimenti vengono applicati all'istanza XML nella tabella T.
use AdventureWorks2008R2;
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="https://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="https://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="https://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;
Si noti l'utilizzo di cast per la sostituzione del valore LotSize, necessario quando il valore deve essere di un tipo specifico. In questo esempio, se il valore è 500, non è necessario eseguire il cast esplicito.