2011-09-06 14 views
7

C'è un modo per combinare questi due valori di sostituzione con 1 istruzione di aggiornamento?TSQL 2005, XML DML - Aggiorna due valori contemporaneamente?

UPDATE dbo.MyTable 
SET MyXmlColumn.modify('replace value of (/node/@att1)[1] with "1"') 
WHERE id = 1 

UPDATE dbo.MyTable 
SET MyXmlColumn.modify('replace value of (/node/@att2)[1] with "2"') 
WHERE id = 1 

http://msdn.microsoft.com/en-US/library/ms190675(v=SQL.90).aspx

+0

Partenza la risposta a http://stackoverflow.com/questions/7395942/updating-multiple-xml-nodes-using-t-sql. –

risposta

6

Non penso che tu sia fortunato, Thx.

Ho provato diverse varianti sintattiche senza gioia. Ad esempio, l'ovvio:

SET MyXmlColumn.modify('...'), MyXmlColumn.modify('...') 

rendimenti:

Il nome della colonna 'MyXmlColumn' è specificato più di una volta nella clausola SET . A una colonna non può essere assegnato più di un valore nella stessa clausola SET . Modificare la clausola SET per assicurarsi che una colonna sia aggiornata a una sola volta. Se la clausola SET aggiorna le colonne di una vista, allora il nome della colonna "MyXmlColumn" potrebbe apparire due volte nella definizione .

Ma non c'è niente di utile per questo messaggio di errore nello spazio DML XML.

La riga di fondo è che Expression1 & Expression2 devono essere elementi singoli.

Anche le discussioni più approfondite finiscono loop attraverso di essa ...

http://blogs.msdn.com/b/denisruc/archive/2005/09/19/471562.aspx

spiacenti. :(

PS: Se riesci a sopportare il hackiness, colata a VARCHAR (MAX), poi facendo un normale replace() dovrebbe fare il trucco Vedi:. Can I do a find/replace in t-sql?

2

No, come indicato nella documentazione, replace value of può operare solo su un singolo nodo in una sola volta. Per quanto ne so, non c'è una soluzione per questo. Avrai bisogno di utilizzare 2 dichiarazioni di aggiornamento.

+1

"Si noti che la destinazione da aggiornare deve essere, al massimo, un nodo che è esplicitamente specificato nell'espressione del percorso aggiungendo un" [1] "alla fine dell'espressione." Ho preso questo per significare che il mio xpath può restituire solo 1 nodo, non se posso avere due valori sostitutivi delle istruzioni ogni target di 1 nodo – TrevDev

1

Se v'è solo un paio di valori che si desidera per cambiare è possibile utilizzare questo approccio che ho trovato a sqlservercentral.Utilizza un'istruzione select per manipolarlo più volte e utilizza una singola istruzione di aggiornamento per modificare i dati della tabella

Non perfetto ma potrebbe essere abbastanza buono in alcuni casi d'uso: fondamentalmente si tratta di una versione semplificata della soluzione di looping per un numero fisso di valori da modificare

DECLARE @temp XML 
SET @temp = (SELECT Column_name FROM Table_name WHERE AuthId = @AuthId) 

SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueId/text())[1] with sql:variable("@NewValue")') 
SET @temp.modify('replace value of (/UmAuthDto/Assignment/QueueName/text())[1] with sql:variable("@NewValue")') 

UPDATE Table_name 
SET Column_name = @temp 
WHERE AuthId = @AuthId 
Problemi correlati