2009-09-17 12 views
21

Muszę zaktualizować pole GroupID do wartości 0. Wyliczyłem, jak pobrać wartość, teraz mam problemy z jej aktualizacją.Zaktualizuj wartość węzła XML w SQL Server

Każda pomoc będzie wielka!

<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) 

Aktualizacja

Co muszę teraz zrobić, to zmiana GroupID każdego jednorzędowych, że ma wartość „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 

ten aktualizuje tylko pierwszy wiersz, który spełnia te kryteria. Jak zaktualizować każdy wiersz?

Aktualizacja 2 Stwierdzenie to działa. Okazuje się, że struktura bazy danych dla pierwszego węzła może być inna. Prosty //GroupID ...etc zaktualizował każdy wiersz. To zawsze głupie małe rzeczy, które potrącają nas haha.

Odpowiedz

32

można zrobić coś takiego:

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

Sprawdź ten artykuł na SQL Server 2005 XQuery and XML-DML więcej szczegółów na temat tego, co można zrobić z .modify słowa kluczowego (wstawianie, usuwanie, wymienić etc.).

Marc

PS: W celu uzyskania wartości, byłoby dużo łatwiej zrobić to w ten sposób:

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

(o ile oczywiście trzeba XML jako zmiennej SQL za coś później)

+0

Właściwie używanie węzłów() i wartości() jest dobrą praktyką. W tym przypadku nie robi żadnej różnicy, ale jeśli wiele kolumn jest poszukiwanych, lepiej użyć węzłów(): "Kombinacja metod nodes() i value() może być bardziej wydajna w generowaniu zestawu zestawów wierszy, gdy ma kilka kolumn "http://technet.microsoft.com/en-us/library/ms187508(SQL.90).aspx –

+0

@Remus: tak, dobry punkt - jeśli potrzebujesz kilku wartości, użycie węzłów() ma sens, zgadzam się . –

+1

Doskonały. właśnie to czego potrzebuje. –

Powiązane problemy