需要帮助编写使用事务的存储过程

时间:2012-06-21 17:47:41

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我正在尝试编写一个检查特定值的存储过程,并返回错误或继续更新语句。我已经尝试过编写proc并且所有内容似乎都是语法上的声音,但是它似乎只检查某个值,当找不到它时,它似乎只是跳过需要发生的更新。我目前的代码如下:

declare @newID varchar = 099393
declare @oldID varchar = 260260
Declare @pMsg   varchar(255) 

if exists (select * from req where dept_id=@oldID)
begin
    SET @pMsg = 'The department ID ' + @oldID + ' cannot be changed at this time.'
    return
end 

Begin Try
    Begin TRAN   
        update dbo.dept
        set dept_id = @newID
    where dept_id = @oldID
COMMIT TRAN
END TRY
BEGIN CATCH
  ROLLBACK TRAN
    update dbo.dept
    set dept_id = @oldID
    where dept_id = @oldID
END CATCH

select dept_id=@newID
return 

1 个答案:

答案 0 :(得分:1)

你的整个Try-Catch块是没有意义的,并且在功能上等于以下

declare @newID varchar = 099393 
declare @oldID varchar = 260260 
declare @pMsg  varchar(255)  

if exists (select * from req where dept_id=@oldID) 
begin 
    set @pMsg = 'The department ID ' + @oldID + ' cannot be changed at this time.' 
    return 
end

update dbo.dept 
set dept_id = @newID 
where dept_id = @oldID

请注意;我删除了trailing dept id select和return关键字。你已经知道新的id了,为什么还要选择它。我已经离开了@pMsg赋值,因为我认为这是一个输出参数。

因此, dept update 无法工作的唯一原因(当req表中不存在旧id时)将是dept表中不存在旧id。

哇我多么愚蠢,没有发现你没有设置varchars的长度,所以newid和oldie的长度都是1,因此不会取指定的值099393和260260

至少他们应该

declare @newID varchar(6) = 099393 
declare @oldID varchar(6) = 260260