20

以下は、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ドキュメントの日付以外の各列を読み取ります。

4

13 に答える 13

6

まず、単純な「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 エージェントが無効になっています。出力ファイルが作成されました。

ここに画像の説明を入力

于 2013-09-04T17:16:42.817 に答える
5

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

于 2014-02-06T08:03:27.380 に答える
4

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

私のコマンドは:

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"

問題が解決しました。

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

于 2015-09-21T11:53:03.950 に答える
2

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

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

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

進捗状況を返信してください...

于 2013-09-04T16:55:31.657 に答える
0

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

于 2017-08-18T19:42:00.527 に答える