2009-09-17 24 views
21

Ho bisogno di aggiornare il campo ID gruppo a 0. Ho scoperto come recuperare il valore, ora sto riscontrando problemi nell'aggiornarlo.Aggiornamento del valore del nodo XML in SQL Server

Qualsiasi aiuto sarebbe fantastico!

<ProblemProfile> 
    <GroupID>-1</GroupID> 
    <LayoutID>1</LayoutID> 
    <MyQueries>false</MyQueries> 
</ProblemProfile> 

Declare @Result xml 
set @Result = convert(xml,(select ProfileXML from profiles where id = 23)) 

SELECT x.value('.', 'int') ID 
FROM @Result.nodes('/ProblemProfile/GroupID') as R(x) 

Aggiornamento

Che cosa devo fare ora è aggiornamento GroupID di ogni singolo riga che ha il valore di 'foo'

declare @foo int 
set @foo = -1 

UPDATE profiles 
SET ProfileXML.modify('replace value of (/ProblemProfile/GroupID/text())[1] with "0"') 
WHERE ProfileXML.value('(/ProblemProfile/GroupID)[1]', 'int') = @foo 

Questo è l'aggiornamento solo la prima riga che soddisfa questo criterio Come aggiornerei ogni riga?

Update 2 Tale affermazione funziona. Risulta che la struttura del database per il primo nodo può essere diversa. Un semplice //GroupID...etc ha aggiornato ogni riga. Sono sempre le piccole cose stupide a farci inciampare a haha.

risposta

32

si può fare qualcosa di simile:

UPDATE 
    dbo.profiles 
SET 
    ProfileXML.modify('replace value of (/ProblemProfile/GroupID/text())[1] with "0"') 
WHERE 
    id = 23 

leggi questo articolo su SQL Server 2005 XQuery and XML-DML per maggiori dettagli su cosa si può fare con la parola chiave .modify (inserire, cancellare, sostituire, ecc).

Marc

PS: Al fine di ottenere il valore, sarebbe molto più facile per fare proprio questo:

SELECT ProfileXML.value('(/ProblemProfile/GroupID)[1]', 'int') as ID 
FROM dbo.profiles 
WHERE id = 23 

(a meno che naturalmente è necessario il XML come una variabile SQL per qualcosa in seguito)

+0

In realtà l'uso di nodi() e valori() è una buona pratica. In questo caso non fa alcuna differenza, ma se sono richieste più colonne è meglio usare i nodi(): "La combinazione dei metodi nodes() e value() può essere più efficiente nel generare il set di righe quando ha più colonne "http://technet.microsoft.com/en-us/library/ms187508(SQL.90).aspx –

+0

@Remus: sì, buon punto: se hai bisogno di più valori, usare i nodi() ha senso, sono d'accordo . –

+1

Eccellente. proprio quello di cui ho bisogno –

Problemi correlati