8

かなり大きな SQL Server テーブル ~100GB を CSV ファイルにエクスポートする必要があります。ただし、出力が単一のcsvファイルになるのではなく、理想的には、10GBごとに10ファイルなどの複数のファイルにする必要があります。

BCP には batch_size 引数があるようですが、これでもすべてのデータが 1 つのファイルに書き込まれますか? 私が必要とすることを行うための他の無料ユーティリティはありますか? ファイルのサイズをバイトまたは行数で指定できるのはどこですか?

これは、Hive/Hadoop プラットフォームでデータを他のソースと組み合わせることができるようにするためです。データをエクスポートするより良い方法があれば、提案をお待ちしています。

4

4 に答える 4

8

OFFSETSQL 2012 のページング関数を bcpとFETCH組み合わせて使用​​できると思います。

SELECT *
FROM Table
ORDER BY ID --Primary Key
OFFSET 100000001 ROWS
FETCH NEXT 100000000 ROWS ONLY
于 2013-07-13T23:51:04.700 に答える
6

残念ながら、BCP の batch_size 引数は出力を制御しません。

このタイプの分割を行った方法:

1 -シンプルだが繰り返し不可能:BCP特定の行範囲のテーブルに対して複数の s を実行するコマンド ファイル (.cmd) を作成します。これにはおそらくIDENTITY(1,1)、テーブルに基づいた主キーが必要です。

bcp "SELECT * FROM MyTable WHERE Id BETWEEN 0 AND 10000000" queryout …  
bcp "SELECT * FROM MyTable WHERE Id BETWEEN 10000000 AND 20000000" queryout …   

2 -シンプルで反復可能、大量のディスクを使用:BCPテーブル全体を単一のファイルに出力しsplit、それぞれに指定されたバイト数で必要な数の新しいファイルを作成するために使用します (注: 行ごとに分割することをお勧めします IMO )。「Cygwin」(GnuWin32 はメンテナンスされなくなりました) を使用してsplit、必要なその他のユーティリティをインストールします。

 bcp MyDb.MySchema.MyTable out C:\MyFile.csv -T -w  
 split -b 10737418240 C:\MyFile.csv C:\MySplitFile_  

次のファイルを生成します

 C:\MySplitFile_aaa
 C:\MySplitFile_aab
 …

3 -複雑だが反復可能で、安全でない T-SQL が必要になる可能性があります。このxp_cmdshell関数を使用して、テーブルを反復処理するストアド プロシージャ内で BCP を呼び出します。

 DECLARE @loop AS INT;   
 --Use WHILE to loop as needed--   
 DECLARE @sql AS VARCHAR(MAX);   
 --Add code to generate dynamic SQL here--   
 DECLARE @bcp AS VARCHAR(MAX);   
 SELECT @bcp='BCP "'+@sql+'" queryout C:\MyFolder\MyFile_'+@loop+'.csv';   

最終的な注意:データで NVARCHAR フィールドを使用している場合は、-wフラグを使用し、出力が UTF-16LE になることに注意する必要があります。Hadoopで何かをしようとする前に、(「Cygwin」から)を使用してUTF-8に変換することを強くお勧めしますiconv

于 2013-07-17T10:41:57.810 に答える
3

最初にファイルをエクスポートしてから、外部で分割します。Windows マシンで実行していると仮定すると、役立つ「フリーウェア」ツールがいくつかあります。詳細については、スーパーユーザーに関するこの他の回答を参照してください。

于 2013-07-13T17:17:59.177 に答える