Sql-Server

“無法打開 BCP 主機數據文件”使用 SSMS 中的 xp_cmdshell 但命令行有效

  • April 30, 2019

我有一個儲存過程,它每隔一段時間就會在一項作業上執行,以 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

並收到此錯誤消息

BCP 錯誤

使用同一命令從同一伺服器上的命令行執行沒有問題。

以下是其他一些觀察結果:

  1. 我可以執行EXEC master..xp_cmdshell 'dir C:\*.*'並且結果按預期返回。
  2. 如果我將文件複製並重命名為不同的名稱,BCP 會選擇它
  3. 我的應用程序沒有打開該文件:我可以移動它、重命名它、編輯和保存它、刪除它等等……沒有任何來自 Windows 的投訴。
  4. 文件的內部格式顯然沒問題(見2.)
  5. NT SERVICE\MSSQLSERVER對目錄具有完全控制權限。
  6. 楓葉隊昨天交易了 Dion Phaneuf

任何幫助表示讚賞。

我剛剛讓你的程式碼為我工作。

嘗試這個:

選項 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
  1. 刪除/移動您的 bcpfile.dat 文件
  2. 在命令行類型上(創建一個虛擬文件——是的,會有導入錯誤,但只是為了過去打開文件……)

迴聲。> c:\bcpfiles\bcpfile.dat 3. 在 SQL Server Management Studio 中重新執行查詢

如果選項 A 有效,那麼這是一個權限問題。如果選項 B 有效(克服最初的錯誤),那麼您有一個打開的文件——即使它似乎沒有打開。有一些實用程序可以幫助找到這些打開的文件,但一種廉價而簡單的測試方法就是重新啟動伺服器——希望它是一個開發/測試盒。

引用自:https://dba.stackexchange.com/questions/128855