it-swarm.com.de

Aktualisieren Sie den XML-Knotenwert in SQL Server

Ich muss das GroupID-Feld auf eine 0 aktualisieren. Ich habe herausgefunden, wie ich den Wert abrufen kann. Ich habe jetzt Probleme bei der Aktualisierung. 

Jede Hilfe wäre toll!

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

Update

Was ich jetzt tun muss, ist das Aktualisieren der GroupID jeder einzelnen Zeile, die den Wert "foo" hat.

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

Dies aktualisiert nur die erste Zeile, die diese Kriterien erfüllt. Wie würde ich jede Zeile aktualisieren?

Update 2 Diese Anweisung funktioniert. Es stellt sich heraus, dass die Datenbankstruktur für den ersten Knoten unterschiedlich sein kann. Eine einfache //GroupID ... etc aktualisiert jede Zeile. Es sind immer die dummen kleinen Dinge, die uns stürzen, haha.

23
Ryan

Sie können so etwas tun:

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

In diesem Artikel unter SQL Server 2005 XQuery und XML-DML finden Sie weitere Informationen dazu, was Sie mit dem Schlüsselwort .modify tun können (Einfügen, Löschen, Ersetzen usw.).

Marc

PS: Um den Wert zu erhalten, wäre es viel einfacher, genau dies zu tun:

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

(es sei denn, Sie benötigen das XML natürlich später als SQL-Variable)

34
marc_s

Die einfachste Möglichkeit, den Text innerhalb des Elements zu ändern

UPDATE [TableName]
   SET  
      [fieldName].modify('replace value of (root/elementName/text())[1] with "wBob"')
GO
0
Tarek El-Mallah