Eine Möglichkeit, damit umzugehen, ist, dies in einer Transaktion zu tun und Ihre SELECT-Abfrage mit einer Aktualisierungssperre für die ausgewählten Zeilen zu versehen, bis die Transaktion abgeschlossen ist.
BEGIN TRAN
SELECT Id FROM Table1 WITH (UPDLOCK)
WHERE AlertDate IS NULL;
UPDATE Table1 SET AlertDate = getutcdate()
WHERE AlertDate IS NULL;
COMMIT TRAN
Dadurch wird die Möglichkeit ausgeschlossen, dass ein konkurrierender Client die ausgewählten Zeilen in dem Moment zwischen Ihrem SELECT und Ihrem UPDATE aktualisiert.
Wenn Sie die Transaktion bestätigen, werden die Aktualisierungssperren freigegeben.
Eine andere Möglichkeit ist, einen Cursor für Ihr SELECT mit der Option FOR UPDATE zu deklarieren. Dann UPDATE WHERE CURRENT OF CURSOR. Das Folgende ist nicht getestet, sollte Ihnen aber die Grundidee vermitteln:
DECLARE cur1 CURSOR FOR
SELECT AlertDate FROM Table1
WHERE AlertDate IS NULL
FOR UPDATE;
DECLARE @UpdateTime DATETIME
SET @UpdateTime = GETUTCDATE()
OPEN cur1;
FETCH NEXT FROM cur1;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Table1
SET AlertDate = @UpdateTime --set value
WHERE CURRENT OF cur1;
FETCH NEXT FROM cur1;
END
1 Stimmen
Ich denke, das ist bisher die beste Lösung stackoverflow.com/questions/22066397/