以下は、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
ドキュメント日付以外の各列。
最初に、単純な '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]に変更する前に、次のエラーを受け取りました。
変更後、コードはSSMSから正常に機能します。サービスはNT AUTHORITY\Local Serviceで実行されています。 SQL Serverエージェントは無効になっています。出力ファイルが作成されました。
出力パスは存在しますか? BCPは、ファイルを作成する前にフォルダーを作成しません。
BCP呼び出しの前にこれを試してください:
EXEC xp_cmdshell 'MKDIR "E:\Storage\Export\Data\"'
ファイルが別のアプリケーションまたはプログラムで開かれている可能性があることを確認してください。その場合、bcp.exeは既存のファイルの内容を上書きできません。
私の場合、次の方法で問題を解決しました。
私のコマンドは:
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"
問題が解決しました。
だから、ファイル名の超過が原因で問題が発生したと思います。したがって、ファイルは見つかりませんでした。
コマンドラインからは機能するが、SQLエージェントからは機能しない場合は、認証の問題だと思います。
SQL Serverエージェントはアカウントで実行されています。アカウントにフォーマットファイルを読み取り、出力ファイルを生成する機能があることを確認してください。
また、アカウントがxp_cmdshellストアドプロシージャを実行できることを確認してください。
進捗状況を書き戻す...
他の誰かが同じ問題に遭遇した場合:私は...lesPerson" queryout'
のではなく ...lesPerson" queryout '
私の場合、この修正は単に管理者モードで実行されていました。
1つのオフコースを使用する場合は、コマンドからno_outputを削除します
SET @sql = 'BCP ....'
EXEC master..xp_cmdshell @sql , no_output
EXEC master..xp_cmdshell @sql
開いているファイルがない場合でも、出力フォルダーを共有した後にこれを受け取りました。
出力用に新しい非共有フォルダーを作成しましたが、すべて問題ありませんでした。 (誰かを助けるかもしれません;-))
コードでデータファイルを書き込んでから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()