Простое изменение вашего текущего кода может дать вам то, что вы ищете.
Вместо того, чтобы возиться с @@Identity
, что почти никогда не подходит, вы один раз вычисляете хэш значения @Id
, сохраняете его в локальной переменной и используете как для оператора insert
, так и для where
предложение оператора update
- то есть, если столбец HashId
уникален.
При этом я не уверен, зачем вам нужен столбец rowId
, а также столбец incId
- если только один из них не предназначен для изменения его значения с помощью оператора обновления в течение времени жизни строки - вы просто храните избыточные данные.
Вот улучшенная версия вашей хранимой процедуры:
CRETAE PROCEDURE [dbo].[io_sp_admin_add_emp]
@id BIGINT,
@lastName varchar(20),
@firstName varchar(20)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION [TranAddEmp]
-- Compute the hash once, store in a local variable
DECLARE @HashId varbinary(8000) = HashBytes('SHA2_256', cast(@id as varbinary(50)))
INSERT INTO empTable(
LastName,
FirstName,
hash_id
)
VALUES(
@lastName,
@firstName,
@HashId
)
UPDATE empTable
SET rowId = incId
WHERE hash_id = @HashId
COMMIT TRANSACTION [TranAddEmp]
END TRY
BEGIN CATCH
-- make sure transaction has started and is not commited
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION [TranAddEmp]
END CATCH
END