如果USE语句失败,如何停止执行SQL脚本(使用GO)?

时间:2014-10-09 22:17:18

标签: sql-server tsql

这有been asked many times,但评价最高的答案并不起作用。

BEGIN TRY 
    USE [**DATABASE**]
END TRY 
BEGIN CATCH
    set noexec on
    raiserror('Oh no a fatal error', 20, -1) with log       
    return 
END CATCH 

GO
IF  EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[xxxxx]') AND parent_object_id = OBJECT_ID(N'[dbo].[xxxxxx]'))
ALTER TABLE [dbo].[xxxxx] DROP CONSTRAINT [xxxxxx]
GO

似乎无论我做什么IF EXISTS仍在运行。我试过了GOTO。我试过了set noexec on。我试过了RETURN

它肯定在USE声明中失败,它肯定会继续在第一个GO之后运行下一个块。

这里的重点是我将此脚本提供给其他人,并且必须在运行之前设置数据库名称。但他们会忘记所以我需要一个很好的描述性错误信息。

1 个答案:

答案 0 :(得分:2)

怎么样:

IF db_id('myDatabase') is null
    RAISERROR('Oh no a fatal error', 20, -1) with log       

PRINT 'Do some stuff'
GO

您可以在db_id函数调用中使用参数(@MyDB)。

真正的问题是我:

  • "使用不存在的数据库"命令引发严重性16错误
  • CATCH块中的代码尝试引发严重性20错误
  • 但CATCH块仅引发严重性16错误

为什么?

- 编辑----------------

USE语句的BOL说(不太清楚,imho):

  

USE在编译和执行时执行并生效   立即。因此,批处理后出现的语句   USE语句在指定的数据库中执行。

因此,假设在这里,该错误是在编译时生成的,因此第一个"批处理" (在第一次开始之前)没有运行,执行直接跳到第二批。