Получение последней версии строки/отметки времени в операторе обновления -Сервер Sql

Я использую столбцы rowversion для обработки оптимистичного параллелизма и хочу получить новое значение rowversion после выполнения обновления, чтобы мой уровень данных имел самое последнее значение и мог выполнять другое обновление с получением исключения параллелизма (, если только запись была обновлена ​​кем-то другим ).

Я просто выполнял вход на уровень данных после обновления, но это было не очень эффективно и не совсем надежно.

Для следующей таблицы:

CREATE TABLE PurchaseType
(
    PurchaseTypeCode nvarchar(20) NOT NULL PRIMARY KEY CLUSTERED (PurchaseTypeCode),
    Name nvarchar(50) NOT NULL,
    TS rowversion NOT NULL
)

Я пытался:

CREATE PROCEDURE PurchaseType_UpdateWithGet
@PurchaseTypeCode nvarchar(20),
@Name nvarchar(50),
@TS rowversion OUTPUT    
AS

UPDATE PurchaseType
SET Name = @Name
WHERE PurchaseTypeCode = @PurchaseTypeCode
 AND TS = @TS

SELECT @TS = TS FROM PurchaseType WHERE PurchaseTypeCode = @PurchaseTypeCode
GO

но не был полностью доволен из-за возможности не получить значение rowverion из чужого обновления. Затем я наткнулся на оператор OUTPUT в документации по версии (http://msdn.microsoft.com/en-us/library/ms182776.aspx. /http://msdn.microsoft.com/en-us/library/ms177564.aspx)и попробовал это:

CREATE PROCEDURE PurchaseType_UpdateWithOutput
@PurchaseTypeCode nvarchar(20),
@Name nvarchar(50),
@TS rowversion OUTPUT    
AS

DECLARE @Output TABLE (TS BINARY(8))

UPDATE PurchaseType
SET Name = @Name
    OUTPUT inserted.TS into @Output
WHERE PurchaseTypeCode = @PurchaseTypeCode
    AND TS = @TS

SELECT TOP 1 @TS = TS FROM @Output
GO

Это хорошо работает. В моих самых простых тестах (я просто запускал 10000 вызовов и синхронизировал их )параметр OUTPUT занимает примерно на 40% больше времени, но все же меньше половины миллисекунды. Ни то, ни другое не заняло заметного времени при включенной функции SET STATISTICS TIME ON.

Мой вопрос: кто-нибудь знает лучший/более простой способ сделать это?

Я надеялся на функцию, аналогичную SCOPE _IDENTITY ()для столбцов идентификаторов, но не могу найти ничего подобного. Кто-нибудь знает, если я что-то пропустил?

Заранее спасибо.

6
задан Simon Vane 6 July 2012 в 08:58
поделиться