残念ながら、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