Оптимистическая блокировка SQL Server - возвращение измененного значения метки времени - PullRequest
3 голосов
/ 15 марта 2011

У меня есть хранимая процедура обновления, которая реализует оптимистическую блокировку. Хранимая процедура выглядит так:

ALTER PROCEDURE [dbo].[usp_Test] 
    @Id AS char(2),
       @recordTimestamp as timestamp
       ...
BEGIN       
    UPDATE XY
           ..
          WHERE ((Id = @Id) AND (recordTimeStamp = @recordTimestamp))       

if @@rowcount = 0
begin
RAISERROR ('this row was changed by another user', 18, 1)
end

SELECT timeStamp from XY where Id = @Idend

Есть ли более простой способ вернуть новую метку времени? Я бы действительно хотел избежать выражения SELECT.

Ответы [ 2 ]

7 голосов
/ 15 марта 2011

Предполагая, что по крайней мере SQL Server 2005 вы можете использовать OUTPUT

UPDATE XY
SET Col = 'foo'
OUTPUT inserted.recordTimeStamp
WHERE ((Id = @Id) AND (recordTimeStamp = @recordTimestamp))    

Или версия, которая использует переменную таблицы для более точного отражения поведения исходного запроса.

DECLARE @Timestamp TABLE(stamp binary(8))

UPDATE XY
SET col='foo'
OUTPUT inserted.recordTimeStamp INTO @Timestamp
WHERE (Id = @Id) AND (recordTimeStamp = @recordTimestamp) 

if @@rowcount = 0
begin
RAISERROR ('this row was changed by another user', 18, 1)
end

SELECT stamp 
FROM @Timestamp
1 голос
/ 15 марта 2011

Очевидно, я был слепым. @@ DBTS (http://msdn.microsoft.com/en-us/library/ms187366(SQL.90).aspx) команда - верный путь.

   ...
if @@rowcount = 0 
begin 
RAISERROR ('this row was changed by another user', 18, 1) 
end  
SELECT @@DBTS
...