0

要求是将服务器 A 中的表(例如 account)复制到服务器 B 中的表 account_two 中。有很多这样的表,每个表都有数千行。

我想为此尝试 BCP。问题是 account_two 的列数可能比 account 少。我知道在这种情况下我可以使用格式文件或临时表。

问题是我没有服务器 A 表。如果有人更改 col 的顺序和编号,bcp 将失败。

在 Sybase 中,查询输出不起作用。剩下的唯一选择是从服务器 A 中的帐户中选择 A , B 然后将此输出写入文件并将此文件用作 BCP IN 中的日期文件。

但是,由于它是庞大的数据,我无法找到一种方便的方法来执行此操作。

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

但是使用这种性能会受到打击。

我不能使用 dump_results() 或 dumper。将数千行数据转换为 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;

您还应该记录列名,以便稍后您可以检查 order 是否没有更改。没有 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 回答