该脚本需要测试以查看备份表是否已经存在,如果存在则停止。这是为了防止覆盖已创建的备份。
以下将停止进一步的脚本执行(但不是解释输出)。但是,它不会设置退出代码值。它需要设置退出代码值以支持自动化。
即使用户不是系统管理员,这也需要工作。因此,严重性代码 > 18 和 WITH LOG 的 RAISEERROR() 不会改善这种情况。
早在 2012 年,该脚本就需要在 SQL Server 上的 sqlcmd.exe 和 SSMS 中运行。
IF EXISTS (SELECT 1 FROM BUDB.INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'TABLE_A')
BEGIN
PRINT 'ERROR: Table BUDB.dbo.TABLE_A already exists.'
RAISERROR('ERROR: Will not create existing backup table.', 18, -1);
SET NOEXEC ON;
END
IF EXISTS (SELECT 1 FROM BUDB.INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'TABLE_B')
BEGIN
PRINT 'ERROR: Table BUDB.dbo.TABLE_B already exists.'
RAISERROR('ERROR: Will not create existing backup table.', 18, -1);
SET NOEXEC ON;
END
您是否尝试过 sqlcmd 的 -b 开关?请参阅https://learn.microsoft.com/en-us/sql/tools/sqlcmd-utility?view=sql-server-ver16#command-line-options
首先,我将重写脚本以使用
XACT_ABORT_ON
andTRY..CATCH
构造而不是SET NO EXEC ON
.根据Erland Sommarskog的建议
这是我用于测试的脚本版本:
至于SQLCMD有两个参数:
默认情况下只有严重性大于 10 的错误,但您可以使用-V参数覆盖它。
这是文档的链接
sqlcmd 执行可能看起来像这样