“无法打开 BCP 主机数据文件”使用来自 SSMS 的 xp_cmdshell 但命令行有效

Bra*_*don 11 sql-server permissions bcp sql-server-2014 xp-cmdshell

我有一个存储过程,它每隔一段时间运行一次作业,以 BCP 处理我编写的应用程序留下的一些文件。

我注意到文件堆积如山,而 BCP 没有提取它们,因此我使用以下命令在 Management Studio 中进行了测试:

DECLARE @sql VARCHAR(MAX)
DECLARE @path VARCHAR(512) = 'C:\BCPFiles\'

--Use BCP to copy files in character format from the target directly into the table. 
SET @sql = 'bcp [MyDB].[dbo].[MyTable] in ' + @path + 'bcpFile.dat -c -T'

EXEC master..xp_cmdshell @sql
Run Code Online (Sandbox Code Playgroud)

并收到此错误消息

BCP 错误

使用相同的命令从同一台服务器上的命令行执行没有问题。

以下是其他一些观察结果:

  1. 我可以运行EXEC master..xp_cmdshell 'dir C:\*.*'并且结果按预期返回。
  2. 如果我将文件复制并重命名为不同的名称,BCP 会选择它
  3. 该文件没有被我的应用程序打开:我可以移动它、重命名它、编辑和保存它、删除它等等......没有来自 Windows 的任何抱怨。
  4. 文件的内部格式显然没问题(见2)
  5. NT SERVICE\MSSQLSERVER 对目录具有完全控制权限。
  6. 枫叶队昨天交易了 Dion Phaneuf

任何帮助表示赞赏。

Sti*_*ing 11

我刚刚让你的代码在我这边工作。

尝试这个:

选项 A

  1. 将“C:\BCPFiles\bcpFile.dat 的完全控制 NTFS 权限分配给您将在 SQL Server Management Studio 中用于运行查询的用户
  2. 在 SQL Server Management Studio 中重新运行查询

选项 B

或者,只是为了克服以下错误,请尝试:

Error = [Microsoft][ODBC Driver 11 for SQL Server]Unable to open BCP host data-file
Run Code Online (Sandbox Code Playgroud)
  1. 删除/移动您的 bcpfile.dat 文件
  2. 在命令行类型上(创建一个虚拟文件——是的,会出现导入错误,但只是为了避免打开文件......)

    echo .> c:\bcpfiles\bcpfile.dat

  3. 在 SQL Server Management Studio 中重新运行查询

如果选项 A 有效,则是权限问题。如果选项 B 有效(克服了原始错误),那么您有一个打开的文件——即使它似乎没有打开。有一些实用程序可以帮助找到这些打开的文件,但一种廉价且简单的测试方法就是重新启动服务器——希望它是一个开发/测试盒。