web-dev-qa-db-ja.com

BCPホストデータファイルを開けません

以下は、BCPステートメントの例です。私はBCPの使用に慣れていないので、あなたの助けと率直さが大歓迎です

フォーマットファイルでも使用しています。

CMDプロンプトから実行すると正常に動作しますが、SQLからエラーが発生します。 BCPステートメントはすべて1行であり、SQL Serverエージェントはローカルシステムとして実行されています。 SQLサーバーとスクリプトは同じシステム上にあります。

Exec master..xp_fixeddrives C、45589 E、423686を実行しました

私は同じ結果でCとEに出力しようとしました

EXEC xp_cmdshell 'bcp "Select FILENAME, POLICYNUMBER, INSURED_DRAWER_100, POLICY_INFORMATION, DOCUMENTTYPE, DOCUMENTDATE, POLICYYEAR FROM data.dbo.max" queryout "E:\Storage\Export\Data\max.idx" -fmax-c.fmt -SSERVERNAME -T

Rmax-c.fmt形式ファイルは次のとおりです。

10.0

7

1      SQLCHAR             0       255     "$#Y#$"          1     FILENAME                               
2      SQLCHAR             0       40      ""               2     POLICYNUMBER                                 
3      SQLCHAR             0       40      ""               3     INSURED_DRAWER_100                           
4      SQLCHAR             0       40      ""               4     POLICY_INFORMATION                           
5      SQLCHAR             0       40      ""               5     DOCUMENTTYPE                                 
6      SQLCHAR             0       40      ""               6     DOCUMENTDATE                                 
7      SQLCHAR             0       8       "\r\n"           7     POLICYYEAR    

この投稿のフォーマット設定により、フォーマットファイルの最後の列は切り取られますが、SQL_Latin1_General_CP1_CI_ASドキュメント日付以外の各列。

17
user2747607

最初に、単純な 'dir c:*。*'を実行してxp_cmdshellの問題を除外します。

私のブログ BCPを使用してファイルをエクスポートする方法を確認してください。

システムに問題があり、BCP.EXEへのパスが見つかりませんでした。

ハードコードのPATH変数を変更してください。

以下の例は、Adventure Worksで動作します。

-- BCP - Export query, pipe delimited format, trusted security, character format
DECLARE @bcp_cmd4 VARCHAR(1000);
DECLARE @exe_path4 VARCHAR(200) = 
    ' cd C:\Program Files\Microsoft SQL Server\100\Tools\Binn\ & ';
SET @bcp_cmd4 =  @exe_path4 + 
    ' BCP.EXE "SELECT FirstName, LastName FROM AdventureWorks2008R2.Sales.vSalesPerson" queryout ' +
    ' "C:\TEST\PEOPLE.TXT" -T -c -q -t0x7c -r\n';
PRINT @bcp_cmd4;
EXEC master..xp_cmdshell @bcp_cmd4;
GO

SQL Server 2012のパスを\ 110 \に変更し、データベースの名前を[AdventureWorks2012]に変更する前に、次のエラーを受け取りました。


enter image description here

変更後、コードはSSMSから正常に機能します。サービスはNT AUTHORITY\Local Serviceで実行されています。 SQL Serverエージェントは無効になっています。出力ファイルが作成されました。

enter image description here

5
CRAFTY DBA

出力パスは存在しますか? BCPは、ファイルを作成する前にフォルダーを作成しません。

BCP呼び出しの前にこれを試してください:

EXEC xp_cmdshell 'MKDIR "E:\Storage\Export\Data\"'
14
Daniel Molnar

ファイルが別のアプリケーションまたはプログラムで開かれている可能性があることを確認してください。その場合、bcp.exeは既存のファイルの内容を上書きできません。

5
Rajesh

私の場合、次の方法で問題を解決しました。

私のコマンドは:

bcp "select Top 1000 * from abc.dbo.abcd" queryout FileNameWithDirectory -c -t "|" -r "0x0a" -S 192.111.1.111 -U xx -P xxxxx

FileNameWithDirectoryが長すぎました。 "D:\project-abc\R&D\abc-608\FilesNeeded\FilesNeeded\DataFiles\abc.csv"

次のような単純なディレクトリに変更します:"D:\abc.csv"

問題が解決しました。

だから、ファイル名の超過が原因で問題が発生したと思います。したがって、ファイルは見つかりませんでした。

4

コマンドラインからは機能するが、SQLエージェントからは機能しない場合は、認証の問題だと思います。

SQL Serverエージェントはアカウントで実行されています。アカウントにフォーマットファイルを読み取り、出力ファイルを生成する機能があることを確認してください。

また、アカウントがxp_cmdshellストアドプロシージャを実行できることを確認してください。

進捗状況を書き戻す...

2
CRAFTY DBA

他の誰かが同じ問題に遭遇した場合:私は...lesPerson" queryout' のではなく ...lesPerson" queryout '

0

私の場合、この修正は単に管理者モードで実行されていました。

0
Arthur Swails

1つのオフコースを使用する場合は、コマンドからno_outputを削除します

SET @sql = 'BCP ....'

EXEC master..xp_cmdshell @sql , no_output

EXEC master..xp_cmdshell @sql
0
Stefan Michev

開いているファイルがない場合でも、出力フォルダーを共有した後にこれを受け取りました。

出力用に新しい非共有フォルダーを作成しましたが、すべて問題ありませんでした。 (誰かを助けるかもしれません;-))

0
Catherine

コードでデータファイルを書き込んでからBCPで読み取る場合は、読み取る前にCLOSE THE DATA FILEを確認してください!

そうしないと、「ホストデータファイルを開けません」というメッセージが表示されます。

Pythonの例:

# Management of temporary bulk insert file.

def openBulkInsertFile(self) :
    self.bulkInsertFile = open('c:/tmp/bulkInsertContent.txt', 'w', newline='')
    self.csvWriter = csv.writer(self.bulkInsertFile)

def closeBulkInsertFile(self) :
    self.bulkInsertFile.close()
0
CodeCabbie