web-dev-qa-db-ja.com

SSMSからxp_cmdshellを使用して「BCPホストデータファイルを開けません」だが、コマンドラインは機能する

私が書いたアプリケーションによって残されたいくつかのファイルを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 Error

同じコマンドを使用して同じサーバーのコマンドラインから実行しても問題ありません。

ここにいくつかの他の観察があります:

  1. 走れる EXEC master..xp_cmdshell 'dir C:\*.*'と結果は期待どおりに戻ります。
  2. ファイルをコピーして別の名前に変更すると、BCPがそれを取得します
  3. アプリケーションでファイルを開いたままにしていない:Windowsからの苦情なしに、ファイルの移動、名前の変更、編集と保存、削除などを行うことができます。
  4. ファイルの内部フォーマットは明らかに問題ありません(2を参照)。
  5. NT SERVICE\MSSQLSERVERには、ディレクトリに対するフルコントロールのアクセス許可があります。
  6. メープルリーフスは昨日ディオン・ファヌフと取引した

どんな助けでもありがたいです。

6
Brandon

私はあなたのコードを私の側で動作させるようにしました。

これを試して:

オプションA

  1. SQL Server Management Studioでクエリを実行するために使用するユーザーに、フルコントロールNTFSアクセス許可を 'C:\ BCPFiles\bcpFile.datに割り当てます。
  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. コマンドラインタイプで(ダミーファイルを作成するには-はい、インポートエラーが発生しますが、ファイルを開くのをやめるためです...)

    echo。> c:\ bcpfiles\bcpfile.dat

  3. SQL Server Management Studioでクエリを再実行する

オプションAが機能する場合は、権限の問題です。オプションBが機能する場合(元のエラーを乗り越えた場合)、開いているように見えなくても、開いているファイルがあります。これらの開いているファイルを見つけるのに役立つユーティリティがありますが、テストする安価で簡単な方法は、サーバーを再起動することです。

8
Sting

これは、ファイル名が欠落しているために発生します。

これは悪いです:

exec master..xp_cmdshell 'bcp "select * from [TestDB].[dbo].[tbl]" queryout "C:\Test\"'

フォルダに書き込むことはできません。ファイルに書き込む必要があります。

これで結構です:

exec master..xp_cmdshell 'bcp "select * from [TestDB].[dbo].[tbl]" queryout "C:\Test\others.txt"'

ファイル名を指定したからです。

0
user133153

エラー= [Microsoft] [ODBC Driver 11 for SQL Server] BCPホストデータファイルを開けません。

  • このエラーに関連して、BCPが出力ディレクトリを開くことができないためです。例:exec master..xp_cmdshell 'bcp "select * from [TestDB].[dbo].[tbl]" queryout "C:\Test\"'
  • 出力ディレクトリをD:..\からC:..\に変更します。以前はこれを満たしていたので問題ありません。
0
Phearin Sok