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 是一个单独的程序,只能通过标准输出和标准错误(它们只是纯文本流)将结果传递给调用程序。因此它无法区分错误、信息性消息、结果集和行计数消息。