首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遇到错误时如何停止执行sql脚本

遇到错误时如何停止执行sql脚本
EN

Stack Overflow用户
提问于 2012-12-05 00:45:45
回答 1查看 9.7K关注 0票数 8

我有一个包含一些sql脚本(DDL和DML)的sql文件,这些脚本是通过从windows命令行调用来执行的。问题是,当发生错误时,它会报告错误,但文件中的所有sql语句仍然会执行,而我希望在其中一个sql语句中遇到第一个错误时,执行应该立即停止。

我使用sql server作为我的数据库

以下是我的脚本示例

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-05 00:48:02

我非常确定当命中错误时,BEGIN TRYBEGIN CATCH将停止执行,并将执行直接转到错误处理程序:

代码语言:javascript
复制
BEGIN TRY

   ' do stuff

END TRY
BEGIN CATCH

   'handle

END CATCH

编辑:下面是一个例子:

代码语言:javascript
复制
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

注释掉上面的除以零行以查看“一切正常”,否则您将在结果集中看到“Oops”

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13707722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档