我创建了一个以 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)结果写入文件非常简单:
由于 PowerShell 将结果作为对象流传递,因此 cmdlet 可以区分数据和消息,并且只将数据放在输出管道上。例如这个
仍然会创建一个有效的 XML 文件,因为只有 SELECT 产生的行通过管道发送到
out-file
.相比之下,sqlcmd.exe 是一个单独的程序,只能通过标准输出和标准错误将结果传递给调用程序,这只是纯文本流。因此它无法区分错误、信息性消息、结果集和行计数消息。
我第二次使用 Powershell 执行查询,但作为
sqlcmd
自己的答案:您可以使用
-r1
参数,它将所有输出重定向到屏幕,而不是文件。从文档
因为如果你使用它会被忽略,
-o
你需要重定向stdout