dbh1 と dbh2 の 2 つのサーバーがあり、dbh1 にクエリを実行し、fetchall_arrayref メソッドを介してデータを取得します。クエリを実行したら、dbh1 からの出力をサーバー dbh2 の一時テーブルに挿入します。
両方のサーバーへのアクセスを同時に確立でき、両方からデータを取得できます。1. dbh1 からデータをプルします。
while($row = shift(@$rowcache) || shift(@{$rowcache=$sth1->fetchall_arrayref(undef, $max_rows)})) {
#call to sub insert2tempData
&insert2tempData(values @{$row});
}
2. 次に、dbh2 に挿入クエリがあります。
INSERT INTO ##population (someid, Type, anotherid)
VALUES ('123123', 'blah', '634234');
質問: dbh1 からの fetchall_arrayref の一括結果をサーバー dbh2 の一時テーブルに (個々のレコードをループせずに) 挿入するにはどうすればよいですか?
わかりました-この問題を解決でき、次のコードを実装できました:
my $max_rows = 38;
my $rowcache = [];
my $sum = 0;
if($fldnames eq "ALL"){ $fldnames = join(',', @{ $sth1->{NAME} });}
my $ins = $dbh2->prepare("insert into $database2.dbo.$tblname2 ($fldnames) values $fldvalues");
my $fetch_tuple_sub = sub { shift(@$rowcache) || shift(@{$rowcache=$sth1->fetchall_arrayref(undef, $max_rows)}) };
my @tuple_status;
my $rc;
$rc = $ins->execute_for_fetch($fetch_tuple_sub, \@tuple_status);
my @errors = grep { ref $_ } @tuple_status;
転送は機能しますが、SQL Server エクスポート/インポート ウィザードを使用して手動でデータを転送する場合よりもまだ遅くなります。私が気づいた問題は、データが行ごとに宛先に流れることであり、バルク転送サイズを増やすことができるかどうか疑問に思っていました. データのダウンロードは非常に高速ですが、ダウンロードとアップロードを組み合わせると速度が劇的に低下し、サーバー間で 5000 行のテーブルを転送するのに最大 10 分かかります。