1

と の 2 つのテーブルがtblRequestsありtblDataます。tblRequestsには という主キーがあり、 というrecIDtblDataキーへの外部キーがありますrequestRecID

では、 2tblRequestsつの列に一意のインデックスがあり、ユーザーが重複した行を入力するのを防ぎます。

問題: で重複挿入を試みると、tblRequests予期したとおりにエラーが発生しますが、tblDataまだ外部キーを更新しています。

では、「挿入が行われなかったtblData場合は更新しない」と言うにはどうすればよいでしょうか。tblRequests

いくつかの調査を行うと、それは適切であるように思わtry/catchれますが、私はこのレベルの SQL にまったく慣れていません。

以下の私のコード:

CREATE Procedure [dbo].[spInsert]
(
    @vOpID varchar(3),
    @vSNumb varchar(12)
)
AS
    Declare @vRecID int
BEGIN 
    BEGIN TRANSACTION
        Insert tblRequests
        (
        opID,
        SNumb
        )
        Values 
        (
        @vOpID,
        @SNumb
        )

        Set @vRecID = IDENT_CURRENT ('tblRequests')

    COMMIT TRANSACTION;
    BEGIN TRANSACTION
        Update tblData 
        Set requestRecID = @vRecID 
        Where SNumb = @SNumb And opID = @vOpID 
    COMMIT TRANSACTION;
END
4

1 に答える 1

2

次のようなものが必要です。

  • 両方の操作にまたがる1つのトランザクション(トランザクションの一部だけでなく、両方の操作を成功させるか、すべてをロールバックしたいため...)

  • ブロック内TRY...CATCH- 最初の操作 ( INSERT) でエラーが発生した場合、ブロックに直接ジャンプしCATCH、2 番目のステートメントを実行せず、トランザクションをロールバックします。

コード:

CREATE Procedure [dbo].[spInsert]
(
    @vOpID varchar(3),
    @vSNumb varchar(12)
)
AS
BEGIN 
    DECLARE @vRecID INT

    BEGIN TRANSACTION
    BEGIN TRY
        INSERT INTO dbo.tblRequests(opID, SNumb)
        VALUES(@vOpID, @SNumb)

        SET @vRecID = SCOPE_IDENTITY()

        UPDATE dbo.tblData 
        SET requestRecID = @vRecID 
        WHERE SNumb = @SNumb AND opID = @vOpID 

        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        SELECT 
            ERROR_NUMBER() AS ErrorNumber,
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_STATE() AS ErrorState,
            ERROR_PROCEDURE() AS ErrorProcedure,
            ERROR_LINE() AS ErrorLine,
            ERROR_MESSAGE() AS ErrorMessage

        ROLLBACK TRANSACTION
    END CATCH
END
于 2013-03-29T17:33:45.933 に答える