Mam proste XML w kolumnie XMLZaktualizuj kolumnę XML serwera SQL za pomocą XQUERY?
<Bands>
<Band>
<Name>beatles</Name>
<Num>4</Num>
<Score>5</Score>
</Band>
<Band>
<Name>doors</Name>
<Num>4</Num>
<Score>3</Score>
</Band>
</Bands>
udało mi się zaktualizować kolumny:
-----just update the name to the id)----
UPDATE tbl1
SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
with sql:column("id")')
wszystko jest w porządku.
Pytanie # 1
Jak mogę korzystać z tej strony internetowej UDPATE wartość na id+"lalala"
:
UPDATE tbl1
SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
with sql:column("id") + "lalala"')
Błąd = XQuery [tbl1.myXml.modify()]: Argument '+' musi być jednym numerycznej prymitywnego typu
Pytanie # 1
Załóżmy, że nie chcę aktualizować pierwszego rekordu ([1]
), ale chcę, aby udpate
(taka sama aktualizacja jak powyżej) tylko tam, gdzie score>4
.
mogę napisać oczywiście w XPath:
replace value of (/Bands/Band[Score>4]/Name/text())[1]
Ale nie chcę, aby to zrobić w XPath. Czy nie ma Normalny sposób to zrobić z klauzula Where
?
coś takiego:
UPDATE tbl1
SET [myXml].modify('replace value of (/Bands/Band/Name/text())[1]
with sql:column("id") where [...score>4...]')
dlaczego zrobili to "[1]"? Czy nie sądzili, że może chcę zaktualizować 'więcej niż 1 element'? –
@RoyiNamir Dokumentacja, która mówi: "Expression1 musi być statycznym singletonem". jest [tutaj] (http://msdn.microsoft.com/en-us/library/ms190675.aspx). To samo dotyczy 'insert', ale' delete' może usunąć więcej niż jeden węzeł. Naprawdę nie wiem, dlaczego zdecydowali się to zrobić, ale jeśli to było dozwolone, mógłbyś skończyć w dziwnych sytuacjach, w których zmodyfikowane węzły zmieniają predykat, który znalazł węzły, które w pierwszej kolejności wymagały modyfikacji. Jeśli potrzebujesz zaktualizować więcej niż jeden węzeł, musisz to zrobić w pętli while. –
Dzięki. Wybieram tę odpowiedź, ponieważ jest ona mniej długa i bardziej czytelna. Ale bardzo dziękuję za obie odpowiedzi! –