Sql-Server

如何設置 sqlcmd.exe 退出程式碼?

  • July 24, 2022

該腳本需要測試以查看備份表是否已經存在,如果存在則停止。這是為了防止覆蓋已創建的備份。

以下將停止進一步的腳本執行(但不是解釋輸出)。但是,它不會設置退出程式碼值。它需要設置退出程式碼值以支持自動化。

即使使用者不是系統管理員,這也需要工作。因此,嚴重性程式碼 > 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_ONandTRY..CATCH構造而不是SET NO EXEC ON.

根據Erland Sommarskog的建議

這是我用於測試的腳本版本:

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

引用自:https://dba.stackexchange.com/questions/314751