0

要件は、サーバー A の account というテーブルをサーバー B のテーブル account_two にコピーすることです。このようなテーブルが多数あり、それぞれ数千の行があります。

そのためのBCPを試してみたい。問題は、account_two が account よりも列数が少ない可能性があることです。このようなシナリオでは、フォーマット ファイルまたは一時テーブルのいずれかを使用できることを理解しています。

問題は、サーバー A のテーブルを所有していないことです。また、誰かが col の順序と番号を変更した場合、bcp は失敗します。

Sybase では queryout が機能していません。残っている唯一のオプションは、サーバー A のアカウントから A 、 B を選択し、この出力をファイルに書き込み、このファイルを BCP IN の日付ファイルとして使用することです。

ただし、膨大なデータであるため、これを行う便利な方法を見つけることができません。

while ( $my row = $isth->fetchrow_arrayref) {
    print FILE JOIN ("\t",@$row),"\n";
}

しかし、このパフォーマンスを使用するとヒットします。

dump_results() またはダンパーを使用できません。数千行のデータを bcp データ ファイル形式に変換するのは追加のタスクです。

誰かが最善のアプローチを決定するのを手伝ってくれるなら。

PS: 私は PERL を初めて使用します。申し訳ありませんが、これに対する明白な答えがあれば。

4

1 に答える 1

0
#!/usr/local/bin/perl

use strict;
use warnings;
use Sybase::BCP;

my $bcp = new Sybase::BCP $user, $passwd;
$bcp->config(INPUT => 'foo.bcp',
             OUTPUT => 'mydb.dbo.bar',
             SEPARATOR => '|');
$bcp->run;

列名も記録する必要があるため、後で順序が変更されていないかどうかを確認できます。列名を取得するための bcp オプションがないため、その情報を取得して個別に保存する必要があります。

それらを並べ替える必要がある場合は、次のようにします。

$bcp->config(...
             REORDER => { 1 => 2,
                          3 => 1,
                          2 => 'foobar',
                          12 => 4},
             ...);

Perl 以外のソリューション:

-- Create the headers file
sqlcmd -Q"SET NOCOUNT ON SELECT 'col1','col2'" -Syour_server -dtempdb -E -W -h-1 -s" " >c:\temp\headers.txt

-- Output data
bcp "SELECT i.col1, col2 FROM x" queryout c:\temp\temp.txt -Syour_server -T -c

-- Combine the files using DOS copy command. NB switches: /B - binary; avoids appending invalid EOF character 26 to end of file.
copy c:\temp\headers.txt + c:\temp\temp.txt c:\temp\output.txt /B
于 2012-04-18T18:16:27.087 に答える