SQL-server: update top(1) - Schleife
Habe ich über andere Einträge und so wie es aussieht werde ich brauchen, einen cursor? Ich bin relativ neu, aber ich bin schwingen hoch mit dieser. Jede Beratung oder Hilfe ist willkommen.
UPDATE top (1) dbo.table
SET [Status] = 1
WHERE [OrderId] = '1337' and [Status] = 0;
GO
Wenn ein Datensatz hat eine OrderID von 1337 und den status 0, ich will, dass es geändert werden, um eine 1, aber dies muss durchgeführt werden, ein zu einer Zeit.
Bearbeiten: ich möchte es Durchlaufen, bis es keine [Status] = 0
- Was ist das problem mit der Abfrage?
- Was meinst du mit " ein zu einer Zeit? Können Sie ein Beispiel geben?
- Hast du einen Primary key in Ihrer Tabelle.
- Können Sie erklären, warum Sie benötigen, aktualisieren Sie Datensätze nacheinander?
- Ich habe einen Primärschlüssel, wird der Datensatz eindeutig.Die Abfrage funktioniert einwandfrei, aber ich möchte es in eine Schleife geht, bis es nicht [Status] = 0
- Aber warum muss dieses getan werden, eine Zeile zu einem Zeitpunkt?
- es ist ein separater Prozess, hat diese Einschränkung
- Eine defekte update-trigger?
- Bitte erläutern Sie auf die "eigenen Prozess". Sie möchten zu versuchen und zu vermeiden RBAR (Zeile durch quälende Zeile) - Funktionalität.
- Sie können fügen Sie einen
OUTPUT
- Klausel zu einerUPDATE
- Anweisung. Wenn das problem gelöst werden kann, indem die "eigenen Prozess" mit einer Liste der aktualisierten Zeilen, das kann die Antwort sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfe ich meine Antwort in der Mischung auch. Ich benutze diese in Produktionssystemen, wo ich brauche, um updates in kleinen Chargen. Sie können ändern Sie die
select top 100 PKid
zutop 1
wenn Sie möchten, um zu gehen, in Losgrößen von einem. Diese Methode erlaubt das skalieren der Chargen-updates, um etwas vernünftiges, finden Sie einen guten Kompromiss zwischen minimalen Schlösser und set-basierten updates. Natürlich, fügt diese Gemeinkosten über eine einzige set-based-Anweisung, aber der OP fragte.Hinweis: ich vermute, es ist ein PK-Feld auf dem Tisch, und ich gab ihm einen angenommenen Namen
PKid
Wenn Sie aktualisieren möchten nur einen Datensatz mit diesem Satz schlage vor, Sie Folgendes tun:
Ich weiß nicht, ob Sie mithilfe von Transact-oder PL, also vielleicht ändern Sie bitte die rowId von ROW_NUMBER. Sie können ändern Sie die rowId durch einen eindeutigen Bezeichner auch.
Die Where-Klausel entsprechen die einzige Zeile zurück, indem Sie die "select" - Klausel.
Können Sie es mit einem cursor for update (wie auch andere Antworten), aber wenn dies nur einmal taks, ist dies eine schnelle Lösung.
update top (1) ...
, wie in der Frage?Bitte vermeiden Sie die Verwendung einer while-oder cursor-Schleife, dies zu tun.
Hier ist ein Update von "Oben"........work around:
http://granadacoder.wordpress.com/2009/07/06/update-top-n-order-by-example/
TOP UPDATE
100 mal