2011-09-06 16 views
7

Czy istnieje sposób na połączenie tych dwóch wartości zamiany z 1 instrukcją aktualizacji?TSQL 2005, XML DML - Zaktualizuj dwie wartości naraz?

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

Sprawdź odpowiedź na http://stackoverflow.com/questions/7395942/updating-multiple-xml-nodes-using-t-sql. –

Odpowiedz

6

Nie sądzę, że masz szczęście, Thx.

Próbowałem kilku wariantów syntaktycznych bez żadnej radości. Na przykład oczywiste:

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

Wynik:

Nazwa kolumna MyXmlColumn "podano więcej niż jeden raz w klauzuli SET . Kolumnie nie można przypisać więcej niż jednej wartości w tej samej klauzuli SET. Zmodyfikuj klauzulę SET, aby upewnić się, że kolumna została zaktualizowana tylko jeden raz. Jeśli klauzula SET aktualizuje kolumny widoku, to nazwa kolumny "Moja kolumna_Miksu" może pojawić się dwukrotnie w definicji widoku .

Ale nic nie jest pomocne dla tego komunikatu o błędzie w przestrzeni XML DML.

Najważniejsze jest to, że Expression1 & Expression2 musi być pojedynczymi elementami.

Nawet najbardziej wnikliwe dyskusje skończyć zapętlenie przez nią ...

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

Niestety. :(

PS: Jeśli można znieść hackiness, rzucając na VARCHAR (MAX), a następnie robi normalny replace() powinno wystarczyć Zobacz:. Can I do a find/replace in t-sql?

2

Nie, jak podano w dokumentacji replace value of może działać tylko na jednym węźle w jednym czasie. O ile mi wiadomo, nie ma na to rozwiązania. Musisz użyć 2 instrukcji aktualizacji.

+1

"Zauważ, że aktualizowany cel musi być co najwyżej jednym węzłem, który jest jawnie określony w wyrażeniu ścieżki przez dodanie" [1] "na końcu wyrażenia." Zrobiłem to, aby zaznaczyć, że moja ścieżka xpath może zwrócić tylko jeden węzeł, nie, czy mogę mieć dwie wartości zastąpienia instrukcji dla każdego targetowania 1 węzła – TrevDev

1

Jeśli masz tylko kilka wartości, które chcesz aby zmienić, możesz użyć tego podejścia, które znalazłem pod numerem sqlservercentral. Używa instrukcji select, aby dane manipulowały nią wielokrotnie i używa pojedynczej instrukcji aktualizacji, aby zmienić dane tabeli.

Nie jest doskonały, ale może być wystarczająco dobry w niektóre przypadki użycia.Zasadniczo jest to uproszczona wersja rozwiązania do zapętlenia dla stałej liczby wartości do zmiany.

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 
Powiązane problemy