通过 SQL Server 代理抑制 SQLCMD 输出中的 SQL Server Management Studio 的“消息”

Abe*_*son 4 sql-server sqlcmd sql-server-agent

我创建了一个以 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
Run Code Online (Sandbox Code Playgroud)

感谢您的建议!

Dav*_*oft 10

更好的方法是切换到 PowerShell 作业步骤,它比 CMDEXEC 强大约 1000%。例如,在 PowerShell 中将 XML(或 JSON)结果写入文件非常简单:

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

由于 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'
Run Code Online (Sandbox Code Playgroud)

仍然会创建一个有效的 XML 文件,因为只有 SELECT 产生的行才会通过管道发送到out-file.

相比之下,sqlcmd.exe 是一个单独的程序,只能通过标准输出和标准错误(它们只是纯文本流)将结果传递给调用程序。因此它无法区分错误、信息性消息、结果集和行计数消息。