1

我正在尝试编写一个存储过程来检查某个值并返回错误或继续更新语句。我已经尝试编写 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 

4

1 回答 1

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

笔记; 我已经删除了尾随的部门 ID 选择和返回关键字。您已经知道新的 ID,所以为什么还要选择它。我保留了@pMsg 分配,因为我认为这是一个输出参数。

因此, dept 更新不起作用的唯一原因(当 req 表中不存在旧 id 时)将是如果旧 id 不存在于 dept 表中。

哇,我多么愚蠢,没有发现这一点,你没有设置你的 varchars 的长度,所以 newid 和 oldie 的长度都是 1,因此不会采用分配的值 099393 和 260260

至少他们应该是

declare @newID varchar(6) = 099393 
declare @oldID varchar(6) = 260260
于 2012-06-21T19:32:25.637 回答