我有一个带有事务的SQL存储过程。实际上,我编写了三个阶段的SP,每个阶段在不同的表格中执行某些操作。问题是,当SP到达第三阶段时,其中一列是varchar(20),但我插入了一个具有30个字符的字符串,尽管SP成功完成,但我期望它进入Catch块并进行回滚。第三阶段没有提交,并且没有将行添加到表中,但仍然感觉像“事务”没有起作用,前两个阶段已提交。
以下是我的SQL SP:
以下是我的SQL SP:
USE [dbfoo]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[io_sp_admin]
@id BIGINT = 0, @firstName VARCHAR(20),@lastName VARCHAR(20) ,@email VARCHAR(50), @birthDate DATETIME
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION [TranAddEmp]
OPEN SYMMETRIC KEY io_key DECRYPTION BY CERTIFICATE foo
--stage1
DECLARE @identity BIGINT = 0
INSERT INTO [dbo].[t1]
([id],
[deleted],
[user_name],
VALUES
(EncryptByKey(KEY_GUID('io_key'), CONVERT(VARBINARY(100),CAST(@id AS VARCHAR(10)))),
0,
'IoAdmin'
SELECT @identity = @@identity
--satge2
INSERT INTO [dbo].[t2]
([id]
,[deleted]
,[user_name]
VALUES
(@identity,
EncryptByKey(KEY_GUID('io_key'), CONVERT(VARBINARY(100),CAST(@ms_zehut AS VARCHAR(10)))),
0,
'IoAdmin'
--stage 3
INSERT INTO t3(
id,
lastName,
firstName,
birtdate,
email)
SELECT
@identity,
@lastName ,
@firstName ,
@birthDate,
@email
CLOSE ALL SYMMETRIC KEYS
SELECT CAST(1 as BIT) as 'Status', 'Succeeded' as 'ReturnMessage'
COMMIT TRANSACTION [TranAddEmp]
END TRY
BEGIN CATCH
SELECT CAST(0 as BIT) as 'Status', 'ADMIN - Add employee failed' as 'ReturnMessage'
ROLLBACK TRANSACTION [TranAddEmp]
END CATCH
END
@@Identity
可以做一些有趣的事情。Scope_Identity()
是一个更好的选择。当涉及多个值时,output
子句是一个很棒的东西。 - HABO