如果 -c,SQLCMD 失敗;在 SQL Server 2019 的參數中指定
以下 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。