这有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之后运行下一个块。
这里的重点是我将此脚本提供给其他人,并且必须在运行之前设置数据库名称。但他们会忘记所以我需要一个很好的描述性错误信息。
答案 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)。
真正的问题是我:
为什么?
- 编辑----------------
USE
语句的BOL说(不太清楚,imho):
USE在编译和执行时执行并生效 立即。因此,批处理后出现的语句 USE语句在指定的数据库中执行。
因此,假设在这里,该错误是在编译时生成的,因此第一个"批处理" (在第一次开始之前)没有运行,执行直接跳到第二批。