Sql-Server

通過 SQL Server 代理從 SQLCMD 的輸出中抑制 SQL Server Management Studio 的“消息”

  • January 1, 2022

我創建了一個以 XML 格式輸出數據的腳本,並且正在使用 SQL Server 代理(類型為“作業系統 (cmdexec)”的作業步驟)每月/每季度執行一項作業,以將數據輸出到特定文件。但是,我們遇到的問題是 SQLCMD 腳本的輸出:

sqlcmd -d <Database> -i "<Package>\<SQLFile>.sql" -o "<OutputFilePath>\<FileName>.xml" -y 0

正在輸出“消息”以及“結果”。有沒有辦法只通過 sqlcmd 寫入結果?

我刪除了一些消息,包括:

“警告:空值被聚合或其他 SET 操作消除。”

“(受影響的 1 行)”

通過使用以下程式碼:

SET NOCOUNT ON
SET ANSI_WARNINGS OFF
GO

感謝您的建議!

更好的方法是切換到 PowerShell 作業步驟,該步驟比 CMDEXEC 強大約 1000%。例如,在 PowerShell 中,將 XML(或 JSON)結果寫入文件非常簡單:

invoke-sqlcmd 'select * from sys.objects for xml path' | % { $_[0] } | out-file 'c:\temp\results.xml'

由於 PowerShell 將結果作為對象流傳遞,因此 cmdlet 可以區分數據和消息,並且只將數據放在輸出管道上。例如這個

invoke-sqlcmd "print 'hello'; create table #T(id int); insert into #t values (12); select * from sys.objects for xml path" -Verbose | % { $_[0] } | out-file 'c:\temp\results.xml'

仍然會創建一個有效的 XML 文件,因為只有 SELECT 產生的行通過管道發送到out-file.

相比之下,sqlcmd.exe 是一個單獨的程序,只能通過標準輸出和標準錯誤將結果傳遞給呼叫程序,這只是純文字流。因此它無法區分錯誤、資訊性消息、結果集和行計數消息。

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