2016-12-09 2 views
0

名前:これに約10時間を費やしていますが、分かりませんでした。私は、入力データと一致する2つのテーブルからレコードを削除するT-SQLストアドプロシージャを作成しようとしています。削除が成功し、トランザクションがコミットされた場合はメッセージを表示し、レコードが見つからない場合はトランザクションをロールバックし、キャッチしてみてください。私は以下のコードを書いていますが、データが入力と一致しなくても、 "Command(s)completed successfully"が得られます。メッセージ!私は間違いを修正するためにあなたの助けに感謝します。存在しないレコードを削除するストアドプロシージャのテーブルからTry Catchの表示が正常に完了しました

Use Northwind 
Go 

Create Procedure uspDeleteOrder 
@orderID int As 
Set nocount on  
If Exists (Select * from Orders Where OrderID = @orderID) 
Begin Try 
    Begin Transaction 
     Delete From dbo.[Order Details] 
     Where dbo.[Order Details].OrderID = @orderID  
     Delete From Orders 
     Where OrderID = @orderID 
    COMMIT TRANSACTION 
    Print 'The article has been deleted!' 
End Try 
Begin Catch 
    IF (@@trancount > 0) 
    Begin   
     ROLLBACK TRANSACTION 
    End 
PRINT '*************Error Detail****************' 
PRINT 'Error Number :' + CAST(ERROR_NUMBER() AS VARCHAR) 
PRINT 'Error Severity:' + CAST(ERROR_SEVERITY() AS VARCHAR) 
PRINT 'Error State :' + CAST(ERROR_STATE() AS VARCHAR) 
PRINT 'Error Line :' + CAST(ERROR_LINE() AS VARCHAR) 
PRINT 'Error Message :' + ERROR_MESSAGE() 
End Catch 

Exec uspDeleteOrder 11077 

がUPDATE:

:[OK]を、私はしかし、私はそれはそれを行うための正しい方法だかどうかわからないんだけど、かなり多くの仕事をしていません推測し、これに私のコードを編集したこれまでのところ私のコードは次のようになります
Create Procedure uspDeleteOrder 
@orderID int As 
Set nocount on  
If Exists (Select * from Orders Where OrderID = @orderID) 
Begin 
    Begin Try 
     Begin Transaction 
      Delete From dbo.[Order Details] 
      Where dbo.[Order Details].OrderID = @orderID  
      Delete From Orders 
      Where OrderID = @orderID 
     COMMIT TRANSACTION 
     Print 'The Order has been deleted!' 
     return 
    End Try 
    Begin Catch 
     IF (@@trancount > 0) 
     Begin   
      ROLLBACK TRANSACTION 
      RAISERROR ('Error', 16,1); 
     End 
     PRINT '*************Error Detail****************' 
     PRINT 'Error Number :' + CAST(ERROR_NUMBER() AS VARCHAR) 
     PRINT 'Error Severity:' + CAST(ERROR_SEVERITY() AS VARCHAR) 
     PRINT 'Error State :' + CAST(ERROR_STATE() AS VARCHAR) 
     PRINT 'Error Line :' + CAST(ERROR_LINE() AS VARCHAR) 
     PRINT 'Error Message :' + ERROR_MESSAGE() 
    End Catch 
End 
Else 
Begin 
    RAISERROR ('No Order ID', 16,1); 
End 

+0

'try'ブロックの最後に' return'を追加してみてください。 – FDavidov

+2

ところで、削除のために一致するレコードが見つからなくても、条件付きのDELETEは常に成功します。 – FDavidov

+0

@FDavidovあなたは最初のTryブロックを意味しますか?どのように役立ちますか?私は終わりの試行の前にリターンを追加しましたが、違いはありません –

答えて

0

キャッチブロック内からRAISERRORする必要があります。

現在、エラーをキャッチしてエラーの詳細を選択していますが、ストアドプロシージャは正常に戻ります。まったくたOrderDetailsはあなたがこれを印刷したい削除しない場所

catchブロックもしそうならそこ

+0

マイナーポイントですが、新しい開発については、エラーを発生させるよりも[スロー](https://msdn.microsoft.com/en-us/library/ee677615.aspx)をお勧めします。 [ソース](https://msdn.microsoft.com/en-us/library/ms178592.aspx?f=255&MSPPError=-2147217396)。 –

0

にライン

RAISERROR ('Err', 16,1); 

を追加しますか? 以下の例のようにすることができます。 印刷の代わりに例外をスローするように変更するのは簡単です。

なぜreturn文ですか?

Create Procedure uspDeleteOrder 
@orderID int As 

Set nocount on  

declare @DeleteOrderDetailCount int 

If Exists (Select * from Orders Where OrderID = @orderID) 
Begin 
    Begin Try 
     Begin Transaction 
      Delete From dbo.[Order Details] 
      Where dbo.[Order Details].OrderID = @orderID  

      select @DeleteOrderDetailCount = @@ROWCOUNT 

      Delete From Orders 
      Where OrderID = @orderID 

     COMMIT TRANSACTION 

     if @DeleteOrderDetailCount = 0 
     begin 
      Print 'There where no orders details to delete' 
     end 

     Print 'The Order has been deleted!' 

     -- why a return here ???? 
     -- return 
    End Try 
    Begin Catch 
     IF (@@trancount > 0) 
     Begin   
      ROLLBACK TRANSACTION 
      RAISERROR ('Error', 16,1); 
     End 
     PRINT '*************Error Detail****************' 
     PRINT 'Error Number :' + CAST(ERROR_NUMBER() AS VARCHAR) 
     PRINT 'Error Severity:' + CAST(ERROR_SEVERITY() AS VARCHAR) 
     PRINT 'Error State :' + CAST(ERROR_STATE() AS VARCHAR) 
     PRINT 'Error Line :' + CAST(ERROR_LINE() AS VARCHAR) 
     PRINT 'Error Message :' + ERROR_MESSAGE() 
    End Catch 
End 
Else 
Begin 
    RAISERROR ('No Order ID', 16,1); 
End 
0

は、あなたがそれはあなたが不要なシナリオをキャプチャするために、いくつかのロジックを実装できるようになる@@行カウント

DECLARE @v1 INT 
DELETE From dbo.[Order Details] 
Where dbo.[Order Details].OrderID = @orderID  
SET @v1 = @@ROWCOUNT 

で影響を受けた行をキャプチャしようとしています。

関連する問題