私が書いたアプリケーションによって残されたいくつかのファイルを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
そして、このエラーメッセージを受け取りました
同じコマンドを使用して同じサーバーのコマンドラインから実行しても問題ありません。
ここにいくつかの他の観察があります:
EXEC master..xp_cmdshell 'dir C:\*.*'
と結果は期待どおりに戻ります。NT SERVICE\MSSQLSERVER
には、ディレクトリに対するフルコントロールのアクセス許可があります。どんな助けでもありがたいです。
私はあなたのコードを私の側で動作させるようにしました。
これを試して:
オプションA
オプションB
または、次のエラーを回避するために試してください:
Error = [Microsoft][ODBC Driver 11 for SQL Server]Unable to open BCP Host data-file
コマンドラインタイプで(ダミーファイルを作成するには-はい、インポートエラーが発生しますが、ファイルを開くのをやめるためです...)
echo。> c:\ bcpfiles\bcpfile.dat
SQL Server Management Studioでクエリを再実行する
オプションAが機能する場合は、権限の問題です。オプションBが機能する場合(元のエラーを乗り越えた場合)、開いているように見えなくても、開いているファイルがあります。これらの開いているファイルを見つけるのに役立つユーティリティがありますが、テストする安価で簡単な方法は、サーバーを再起動することです。
これは、ファイル名が欠落しているために発生します。
これは悪いです:
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"'
ファイル名を指定したからです。
エラー= [Microsoft] [ODBC Driver 11 for SQL Server] BCPホストデータファイルを開けません。
exec master..xp_cmdshell 'bcp "select * from [TestDB].[dbo].[tbl]" queryout "C:\Test\"'
D:..\
からC:..\
に変更します。以前はこれを満たしていたので問題ありません。