8

Windowsコマンドラインから呼び出すことによって実行するいくつかのSQLスクリプト(DDLおよびDML)を含むSQLファイルがあります。問題は、エラーが発生したときにエラーを報告しますが、ファイル内のすべてのSQLステートメントは引き続き実行されますが、SQLステートメントの1つで最初のエラーが発生するとすぐに、そこで実行を停止する必要があります。

DBとしてSQLサーバーを使用しています

以下は私のスクリプトのサンプルです

    CREATE TABLE #tmpErrors (Error int)
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
GO

/** Main Scripts **/
PRINT N'Creating [dbo].[Student]'
GO
CREATE TABLE [dbo].[Student](
    [Id] [bigint] NOT NULL,
    [Subject] [varchar](15) NOT NULL,
    CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    )
)
GO
IF @@ERROR<>0 AND @@TRANCOUNT>0 ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END
GO

PRINT N'Adding [StudentID] column to [dbo].[School]'
GO
ALTER TABLE [dbo].[School] ADD [StudentID] [bigint] NULL
GO
IF @@ERROR<>0 AND @@TRANCOUNT>0 ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END
GO

/***And many other DDL and DML statements, each followed by an error check***/


/**
 * Main teardown 
 */
IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION
GO

IF @@TRANCOUNT>0 BEGIN
PRINT 'The database update succeeded'
COMMIT TRANSACTION
END
ELSE PRINT 'The database update failed'
GO

IF EXISTS (SELECT * FROM #tmpErrors) OR (@@ERROR<>0)
BEGIN
RAISERROR (N'An error was encountered', 20, 1 ) WITH LOG, NOWAIT, SETERROR SELECT @@ERROR AS error_number
END
GO

/**
 * Final teardown
 */
DROP TABLE #tmpErrors
GO
4

1 に答える 1

8

私はかなり確信してBEGIN TRYおりBEGIN CATCH、エラーが発生したときに実行を停止し、実行をエラーハンドラーに直接実行します。

BEGIN TRY

   ' do stuff

END TRY
BEGIN CATCH

   'handle

END CATCH

編集:ここに例があります:

BEGIN TRY

    DECLARE @int int
    SET @int = 1

    SET @int = 1 / 0

    SET @int = 2

    SELECT 'Everything OK'

END TRY
BEGIN CATCH

    SELECT 'Oops'

END CATCH

上記のゼロ除算の行をコメントアウトして「すべてOK」を表示します。コメントしないと、結果セットに「おっと」と表示されます。

于 2012-12-04T16:48:02.257 に答える