Sql-Server

如果 -c,SQLCMD 失敗;在 SQL Server 2019 的參數中指定

  • March 9, 2022

以下 sqlcmd 失敗,沒有錯誤也沒有輸出,只是靜默返回。

SQLCMD -U dbuser -d dbname -w 255 -h-1 -P mypassword -S dbserver -Q "ALTER TABLE xyz ADD abcd NUMERIC(1)" -c;

雖然沒有-c;參數它工作正常

SQLCMD -U dbuser -d dbname -w 255 -h-1 -P mypassword -S dbserver -Q "ALTER TABLE xyz ADD abcd NUMERIC(1)"

這個參數在 2005 年之前就已經存在,使用 OSQL,然後最近(不到一年前)我們用 SQLCMD 替換了 OSQL。

現在我們發現我們的一個安裝腳本沒有執行,它歸結為這個-c;論點。

此外,我正在 SQL Server 2019 上進行測試。我要求某人在 SQL Server 2008 上執行相同的腳本,並且 SQLCMD 正在使用該-c;參數。

我什至嘗試指定:和其他一些字元而不是;無濟於事。

這個參數應該怎麼用?如果不再推薦或不再支持使用它,請指出任何文件/錯誤報告/發行說明。

sqlcmd 實用程序文件說:

-c batch_terminator
指定批處理終止符。預設情況下,通過在一行中單獨鍵入單詞“GO”來終止命令並將其發送到 SQL Server。重置批處理終止符時,請勿使用 Transact-SQL 保留關鍵字或對作業系統具有特殊含義的字元,即使它們前面有反斜杠。

$$ emphasis mine $$

如果您查看Transact-SQL 語法約定 (Transact-SQL)文件,您會發現:

; Transact-SQL 語句終止符。儘管此版本的 SQL Server 中的大多數語句不需要分號,但在將來的版本中將需要它。

該資訊添加到 Stewart Gordon 指出的為什麼我應該在 SQL 中使用分號?

SQL 的 ANSI/ISO 標準要求語句用分號分隔。因此,大多數 SQL 實現都需要它們。我認為 Microsoft SQL Server 2012 及更早版本是少數偏離此標準的版本之一。

我會說分號現在是一個保留關鍵字,儘管它在 T-SQL 上還不是必需的。


如何顯示錯誤資訊

錯誤報告選項

-b指定 sqlcmd 在發生錯誤時退出並返回 DOS ERRORLEVEL 值。當 SQL Server 錯誤消息的嚴重級別大於 10 時,返回給 DOS ERRORLEVEL 變數的值為 1;否則,返回值為 0。如果除了 -b 之外還設置了 -V 選項,如果嚴重級別低於使用**-V**設置的值,則 sqlcmd 不會報告錯誤。命令提示符批處理文件可以測試 ERRORLEVEL 的值並適當地處理錯誤。sqlcmd不報告嚴重級別為 10 的錯誤(資訊性消息)。

如果 sqlcmd 腳本包含不正確的註釋、語法錯誤或缺少腳本變數,則返回的 ERRORLEVEL 為 1。

-m error_level
控制將哪些錯誤消息發送到stdout。發送嚴重級別大於或等於此級別的消息。當此值設置為 -1 時,將發送包括資訊性消息在內的所有消息。-m和**-1之間不允許有空格。例如,-m-1**有效, -m -1無效。

此選項還設置 sqlcmd 腳本變數 SQLCMDERRORLEVEL。此變數的預設值為 0。

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