I have an update stored procedure that implements opt开发者_JS百科imistic locking. The stored procedure looks like this:
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
Is there a simpler way to return the new timestamp? I would really like to avoid the SELECT
statement.
Assuming at least SQL Server 2005 you can use OUTPUT
UPDATE XY
SET Col = 'foo'
OUTPUT inserted.recordTimeStamp
WHERE ((Id = @Id) AND (recordTimeStamp = @recordTimestamp))
Or a version that uses a table variable to more closely mirror the behaviour of the original query.
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
Obviously I was blind. @@DBTS(http://msdn.microsoft.com/en-us/library/ms187366(SQL.90).aspx) command is the right way to go.
...
if @@rowcount = 0
begin
RAISERROR ('this row was changed by another user', 18, 1)
end
SELECT @@DBTS
精彩评论