Sql-Server
通過 SQL Server 代理從 SQLCMD 的輸出中抑制 SQL Server Management Studio 的“消息”
我創建了一個以 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 是一個單獨的程序,只能通過標準輸出和標準錯誤將結果傳遞給呼叫程序,這只是純文字流。因此它無法區分錯誤、資訊性消息、結果集和行計數消息。