Ich habe eine einfache XML in einer XML-SpalteSQL Server-XML-Spalte mit XQUERY aktualisieren?
<Bands>
<Band>
<Name>beatles</Name>
<Num>4</Num>
<Score>5</Score>
</Band>
<Band>
<Name>doors</Name>
<Num>4</Num>
<Score>3</Score>
</Band>
</Bands>
ich es geschafft haben, mit der Spalte zu aktualisieren:
-----just update the name to the id)----
UPDATE tbl1
SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
with sql:column("id")')
Alle in Ordnung.
Frage # 1
Wie kann ich diese Abfrage verwenden, um den Wert zu id+"lalala"
udpate:
UPDATE tbl1
SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
with sql:column("id") + "lalala"')
Fehler = XQuery [tbl1.myXml.modify()]: Das Argument '+' muss aus einem einzigen numerischen primitiven Typ sein
Frage # 1
Sagen wir, ich möchte nicht zuerst Datensatz aktualisieren ([1]
), aber ich möchte udpate
(das gleiche Update wie oben) nur wo score>4
.
Ich kann natürlich im XPath schreiben:
replace value of (/Bands/Band[Score>4]/Name/text())[1]
Aber ich nicht, dass es in der XPath tun will. Gibt es keine normale Methode, dies mit einer Klausel Where
zu tun?
so etwas wie:
UPDATE tbl1
SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
with sql:column("id") where [...score>4...]')
Warum haben sie diese "[1]" Sache gemacht? Haben sie nicht gedacht, dass ich "mehr als ein Element" aktualisieren möchte? –
@RoyiNamir Die Dokumentation "Expression1 muss ein statischer Singleton sein". ist [hier] (http://msdn.microsoft.com/en-us/library/ms190675.aspx). Dasselbe gilt für "Einfügen", aber "Löschen" kann mehr als einen Knoten löschen. Ich weiß nicht wirklich, warum sie sich dafür entschieden haben, aber wenn es erlaubt wäre, könnten Sie in seltsame Situationen geraten, in denen die modifizierten Knoten das Prädikat ändern, das die Knoten gefunden hat, die modifiziert werden mussten. Wenn Sie mehr als einen Knoten aktualisieren müssen, müssen Sie dies in einer while-Schleife tun. –
Danke. Ich wähle diese Antwort, weil sie weniger lang und lesbarer ist. Aber vielen Dank für beide Antworten! –