Sql-Server
如何設置 sqlcmd.exe 退出程式碼?
該腳本需要測試以查看備份表是否已經存在,如果存在則停止。這是為了防止覆蓋已創建的備份。
以下將停止進一步的腳本執行(但不是解釋輸出)。但是,它不會設置退出程式碼值。它需要設置退出程式碼值以支持自動化。
即使使用者不是系統管理員,這也需要工作。因此,嚴重性程式碼 > 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://docs.microsoft.com/en-us/sql/tools/sqlcmd-utility?view=sql-server-ver16#command-line-options
首先,我將重寫腳本以使用
XACT_ABORT_ON
andTRY..CATCH
構造而不是SET NO EXEC ON
.這是我用於測試的腳本版本:
SET XACT_ABORT ON BEGIN TRY DECLARE @DbName sysname = DB_NAME() IF (@DbName LIKE 'm%') BEGIN RAISERROR('ERROR: DbName starts with m', 16, -1); END SELECT @@VERSION /* test if script continues */ END TRY BEGIN CATCH ;THROW /* Needed to rethrow the error*/ END CATCH
至於SQLCMD有兩個參數:
- -b = 如果出現錯誤則終止批處理作業
- -V = error_severity_level
預設情況下只有嚴重性大於 10 的錯誤,但您可以使用*-V*參數覆蓋它。
這是文件的連結
sqlcmd 執行可能看起來像這樣
sqlcmd -S localhost -d master -i "FullPath.sql" -b; $LASTEXITCODE