Aktualisierungswert aller XML-Tags in T-SQL

Gibt es eine Möglichkeit, den Wert von mehreren Vorkommen eines Tags in einem XML in SQL server zu replace?

Ich muss nach einem bestimmten Tag (FirstName) suchen und alle Werte durch einen anderen replace.

Hier ist mein Beispiel xml:

<Root> <Patient> <FirstName>Something</FirstName> <MiddleInitial>W</MiddleInitial> <LastName>West</LastName> </Patient> <Patient> <FirstName>Another</FirstName> <MiddleInitial>E</MiddleInitial> <LastName>East</LastName> </Patient> </Root> 

Meine gewünschte Ausgabe ist:

 <Root> <Patient> <FirstName>TEST</FirstName> <MiddleInitial>W</MiddleInitial> <LastName>West</LastName> </Patient> <Patient> <FirstName>TEST</FirstName> <MiddleInitial>E</MiddleInitial> <LastName>East</LastName> </Patient> </Root> 

Ich habe derzeit diese Änderung Aussage, die das erste Vorkommen ändern wird, aber es ignoriert die nächste 'FirstName' Tag, die kommt:

 SET @x.modify(' replace value of (/Root/Patient/FirstName[1]/text())[1] with "TEST" '); 

Was gibt mir das:

 <Root> <Patient> <FirstName>TEST</FirstName> <MiddleInitial>W</MiddleInitial> <LastName>West</LastName> </Patient> <Patient> <FirstName>Another</FirstName> <MiddleInitial>E</MiddleInitial> <LastName>East</LastName> </Patient> </Root> 

Ich habe versucht, dies in eine while-loop zu casting, um auszuführen, wenn der Pfad existiert, aber es sieht so aus, als hätte ich gerade eine Endlosschleife erstellt:

 WHILE @x.exist('(/Root/Patient/FirstName[1]/text())[1]') = 1 

Irgendwelche Gedanken, um dieses zu erhalten, würde sehr geschätzt!

Ich bin mir sicher, dass es einen besseren path gibt, aber ein Ansatz wäre

 WHILE @x.exist('(/Root/Patient/FirstName[text() != "TEST"])') = 1 SET @x.modify(' replace value of (/Root/Patient/FirstName[text() != "TEST"][1]/text())[1] with "TEST" ');