9

エラーが発生した場合、トランザクションをロールバックできます。

CREATE PROCEDURE [dbo].[MySproc]
(
   @Param1  [int] 
)
AS
BEGIN TRAN
SET NOCOUNT ON;

SELECT @Param1
UPDATE [dbo].[Table1]
SET    Col2 = 'something'
WHERE Col1 = @Param1

IF @@ERROR <> 0
BEGIN
    ROLLBACK TRAN
    RETURN -12
END
...

Table1しかし、Col1 = @Param1トランザクションが正常にコミットされたエントリがない場合、これは私にとって悪いことです。Col2 = 'something'本当に出来ているか確認したい。そうでない場合は、特定の戻りコードでロールバックします。次のように、チェックの後にチェック
を挿入しようとすると、次のようになります。@@rowcount@@error

CREATE PROCEDURE [dbo].[MySproc]
(
   @Param1  [int] 
)
AS
BEGIN TRAN
SET NOCOUNT ON;

SELECT @Param1
UPDATE [dbo].[Table1]
SET    Col2 = 'something'
WHERE Col1 = @Param1

IF @@ERROR <> 0
BEGIN
    ROLLBACK TRAN
    RETURN -12
END

IF @@ROWCOUNT = 0
BEGIN
    ROLLBACK TRAN
    RETURN -27
END
...

@@rowcountは常に最後のステートメントを評価するため、この時点で常にロールバックし0ます。

@@errorこのような場合、影響を受ける行と行数の両方を確認するにはどうすればよいでしょうか?

4

1 に答える 1

16

両方を1つのクエリで独自の変数に格納してから、次のことを確認してください。

DECLARE @rc int
DECLARE @err int
SELECT @Param1
UPDATE [dbo].[Table1]
SET    Col2 = 'something'
WHERE Col1 = @Param1
SELECT @rc = @@ROWCOUNT,@err = @@ERROR

IF @err <> 0
BEGIN
    ROLLBACK TRAN
    RETURN -12
END

IF @rc = 0
BEGIN
    ROLLBACK TRAN
    RETURN -27
END
于 2012-11-13T07:13:49.150 に答える