【问题标题】:Invoke-Sqlcmd cannot find file when BULK INSERT is used使用 BULK INSERT 时 Invoke-Sqlcmd 找不到文件
【发布时间】:2021-08-01 08:58:07
【问题描述】:

我在从命令行和脚本中调用以下 PowerShell 命令时遇到困难:

Invoke-Sqlcmd -HostName **HOST** -Database **DATABASE** 
-Username **USER** -Password **PWD** -Query "TRUNCATE **THE_TABLE** 
BULK INSERT **THE_TABLE** FROM 'D:\Folder\csvfiles\import.csv' 
WITH ( FIRSTROW = 2,  FIELDTERMINATOR = ',', ROWTERMINATOR = '\n',TABLOCK)" 
-ServerInstance "tcp:**HOST**"

我已将 CSV 文件复制到父文件夹,然后复制到根目录。每次,命令都会失败并出现以下错误:

Invoke-Sqlcmd:无法批量加载。文件“D:\Folder\csvfiles\import.csv”不存在。
在 line:1 char:1

这是任务计划程序每小时运行的脚本的一部分。通常它会运行得很好。今天它出错的频率越来越高。

我被难住了。为什么它找不到明显存在的文件?我是否忽略了什么?

【问题讨论】:

  • 我建议你添加一些目录转储命令来证明它的存在。即将此行添加到您的脚本中:ls D:\Folder\csvfiles 然后您可以确定脚本实际上可以看到文件和文件夹
  • 您不会从 excel 中打开/生成此 CSV 吗?因为如果您保持打开文件,excel通常会锁定文件
  • 文件肯定在那里。脚本的另一部分(不是 PS)创建它。该文件未在 Excel 中打开。它在没有安装 Office 的服务器上运行。更奇怪的是,我将 csv 文件从服务器复制到我的工作站,然后再次运行 cmdlet。这一次,错误更具描述性:Invoke-Sqlcmd:无法批量加载,因为无法打开文件“C:\Users\xxxxx\Documents\WindowsPowerShell\Scripts\import.csv”。操作系统错误码3(系统找不到指定的路径)。
  • 所以你的ls 命令显示了文件?这将帮助您排除一个简单的错误。
  • 因为当一些显而易见的事情不起作用时,最好的办法是通过查看脚本的真实情况来确认一些假设。

标签: powershell


【解决方案1】:

我发现有一个相关的、竞争的任务计划在非常接近我的脚本运行的同时删除文件夹中的所有 csv 文件。结果证明是时机不对。

【讨论】:

    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多