要求是将服务器A中的表格帐户复制到服务器B中的表格account_two。 有很多像这样的表,每个表都有数千行。
我想尝试BCP。问题是account_two可能比帐户更少cols。 我理解在这种情况下我可以使用格式文件或临时表。
问题是我没有自己的服务器A表。如果有人更改了col的顺序和no,则bcp将失败。
在Sybase中,queryout无效。 剩下的唯一选择是从服务器A中的帐户执行选择A,B,然后将此输出写入文件,并将此文件用作BCP IN中的日期文件。
但是,由于数据庞大,我无法找到方便的方法。
while ( $my row = $isth->fetchrow_arrayref) {
print FILE JOIN ("\t",@$row),"\n";
}
但是使用这种表现会受到影响。
我不能使用dump_results()或dumper。将数千行数据转换为bcp数据文件格式将是一项额外的任务。
如果有人可以帮我决定最佳方法。
PS:我是PERL的新手。对不起,如果有明显的答案。答案 0 :(得分: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