Я обновился с SQL Server 2005 до 2008. Я помню, что в 2005 году ROWLOCK просто не работал, и мне приходилось использовать PAGELOCK или XLOCK для достижения любого типа фактической блокировки. Я знаю, что читатель этого спросит: «Что ты сделал не так?» Ничего такого. Я убедительно доказал, что могу редактировать строку «ROWLOCKED», но не могу, если повыслю уровень блокировки. У меня не было возможности проверить, работает ли это в SQL 2008. Мой первый вопрос: кто-нибудь сталкивался с этой проблемой в 2008 году?
Второй мой вопрос заключается в следующем. Я хочу проверить, существует ли значение, и если да, выполнить обновление в соответствующих столбцах, а не вставлять всю строку. Это означает, что если строка найдена, ее необходимо заблокировать, поскольку процедура обслуживания может удалить эту строку в середине процесса, что приведет к ошибке.
Чтобы проиллюстрировать принцип, будет ли работать следующий код?
BEGIN TRAN
SELECT ProfileID
FROM dbo.UseSessions
WITH (ROWLOCK)
WHERE (ProfileID = @ProfileID)
OPTION (OPTIMIZE FOR (@ProfileID UNKNOWN))
if @@ROWCOUNT = 0 begin
INSERT INTO dbo.UserSessions (ProfileID, SessionID)
VALUES (@ProfileID, @SessionID)
end else begin
UPDATE dbo.UserSessions
SET SessionID = @SessionID, Created = GETDATE()
WHERE (ProfileID = @ProfileID)
end
COMMIT TRAN
MERGE
(technet.microsoft.com/en -us/library/bb510625.aspx)? - person Ed Harper   schedule 02.12.2010