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

ノート; 末尾の dept id select および return キーワードを削除しました。あなたはすでに新しいIDを知っているので、わざわざそれを選択する必要はありません. これは出力パラメーターであると想定しているため、@pMsg の割り当てはそのままにしておきます。

そのため、 dept の更新が機能しない唯一の理由(古い ID が req テーブルに存在しなかった場合) は、古い ID が dept テーブルに存在しなかった場合です。

varchar の長さを設定していないので、newid と oldie の両方の長さが 1 であるため、割り当てられた値 099393 と 260260 を取りません。

少なくともそうあるべきだ

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