【发布时间】:2019-02-10 07:25:01
【问题描述】:
我有一个带有Transaction 的SQL 存储过程。
我实际上用三个阶段编写了 SP,每个阶段都在不同的表中做一些事情。
问题是,当 SP 进入第三阶段时,其中一列是 varchar(20),但我插入了一个包含 30 个字符的字符串,尽管 SP 成功完成,但我希望它进入 Catch 块并制作一个ROLLBACK。
第三阶段没有提交,也没有向表中添加任何行,但是,感觉就像Transcation 没有工作,两个第一阶段都提交了。
这是我的 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子句是一件很棒的事情。 -
10x 老兄..我去看看
标签: sql sql-server tsql error-handling transactions