【问题标题】:Script works in Command Prompt but not in SQL Job using SQLCMD脚本在命令提示符中有效,但在使用 SQLCMD 的 SQL 作业中无效
【发布时间】:2023-03-19 21:26:01
【问题描述】:

我有一个看起来像这样的脚本:

sqlcmd -S ServerName -d database -E -i "C:\Report1.sql"  -o E:\Folder\SubFolder\FileDate_%date:~-4%_%date:~4,2%.csv -s"," -w 700 

目的是自动运行 .sql 文件并将结果导出到文件名中带有日期的 .csv 文件。

如果我从命令提示符运行此脚本,它可以正常工作,但是当我将它放入 SQL Server 代理作业时,它会失败并显示错误消息:

Sqlcmd: Error: Error occurred while opening or operating on file E:\Folder\SubFolder\FileDate_%date:~-4%_%date:~4,2%.csv (Reason: The filename, directory name, or volume label syntax is incorrect).  Process Exit Code 1.  The step failed.

两者都由管理员运行,我使用的是 SSMS 2014。此外,作业类型为:操作系统(CmdExec)并运行为:SQL Server 代理服务帐户。

欢迎提出任何建议或替代方法。我的假设是 sqlcmd 文件名中的日期获取命令有问题

【问题讨论】:

  • 将 SQL 代理尝试对文件执行的命令回显。这会告诉你在构建命令行时是否有错误。
  • 不看环境就很难判断。一个想法:如果E:是网络共享,而SQL Server代理服务账号不是域用户,而你在域中,则不能以本地用户访问域资源。
  • sql server 实例需要访问“E:\Folder\SubFolder\”。
  • “两者都由管理员运行并且我使用的是 SSMS 2014”是什么意思?除非您指定代理,否则作业始终使用 SQL Server 代理服务帐户的权限运行。
  • @XingzhouLiu 我的意思是 SQL Server 代理服务帐户是管理员,我以管理员身份在命令提示符中测试了脚本

标签: sql-server cmd sqlcmd sql-job


【解决方案1】:

这可能是因为日期和时间会根据与调用进程关联的语言设置产生不同的输出,因此要确定发生了什么,您应该首先设置一个变量然后使用它,而不是尝试直接组合文件名用于 -o 参数并将其值打印到文件中。

即:

set foutname= "E:\Folder\SubFolder\FileDate_%date:~-4%_%date:~4,2%.csv"
@echo %foutname% > "E:\Folder\SubFolder\mychecklogfile.txt"

sqlcmd -S ServerName -d database -E -i "C:\Report1.sql"  -o "%foutname%" -s"," -w 700

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-14
    • 2017-10-12
    • 1970-01-01
    • 2020-12-19
    • 2021-11-13
    • 2017-03-26
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多