2012-06-21 149 views
1

我正在嘗試編寫一個存儲過程來檢查某個值並返回錯誤或繼續更新語句。我已經嘗試編寫過程,並且一切看起來都是語法上的,但它似乎只是檢查某個值,並且在沒有找到它時似乎忽略了需要發生的更新。我當前的代碼如下:需要幫助編寫使用事務的存儲過程

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

if exists (select * from req where [email protected]) 
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 [email protected] 
return 

+0

所有的存儲過程本質上是在交易中。就我所知,沒有必要在代碼中實現回滾。 – Matthew

+0

嗯真正的..我試着運行它沒有事務位,只是與條件後的更新語句,它似乎仍然跳過更新和輸出(0行受到影響) – RobGries

+0

你可以請更多的描述是什麼意向行爲是? – Matthew

回答

1

嗯,你的整個try-catch塊是毫無意義的,並且在功能上等同於以下

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

if exists (select * from req where [email protected]) 
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 

注意;我已經刪除了後面的dept id select和return關鍵字。你已經知道了新的ID,那麼爲什麼要選擇它。我已經將@pMsg賦值留下了,因爲我認爲這是一個輸出參數。

因此,部門更新不工作(當舊ID在req表中不存在時)的唯一原因將是舊部署ID不存在於部門表中。

哇我是多麼愚蠢不察覺這一點,你沒有設置你的VARCHAR處理的長度,這樣既newid的和過時的歌曲,有1的長度,因此不會採取分配的值099393和260260

至少他們應該是

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

謝謝。這似乎工作後,我修好了我的數據類型...哦,哦!它期望char而不是varchar。 – RobGries

+0

好你也注意到了:) –

+0

在這種情況下,是的嘗試catch是毫無意義的,因爲只有一個事務。但是,如果你正在做多個插入/更新/刪除,你應該使用它們。 – HLGEM