Perl DB查询后写入文件,然后将此文件用作中BCP的数据文件的最佳方式

Perl DB查询后写入文件,然后将此文件用作中BCP的数据文件的最佳方式,perl,perl-module,Perl,Perl Module,要求是将服务器a中的表(如account)复制到服务器B中的表account_2。 有许多这样的表,每个表都有数千行 我想试试BCP。问题是account_2的COL可能比account少。 我知道在这种情况下,我可以使用格式文件或临时表 问题是我没有自己的服务器A表。如果有人更改col的顺序和编号,bcp将失败 在Sybase中,queryout不工作。 剩下的唯一选项是从服务器a中的帐户中选择a、B,然后将此输出写入文件,并将此文件用作中BCP的日期文件 然而,由于数据量巨大,我无法找到一种

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

我想试试BCP。问题是account_2的COL可能比account少。 我知道在这种情况下,我可以使用格式文件或临时表

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

在Sybase中,queryout不工作。 剩下的唯一选项是从服务器a中的帐户中选择a、B,然后将此输出写入文件,并将此文件用作中BCP的日期文件

然而,由于数据量巨大,我无法找到一种方便的方法来实现这一点

while ( $my row = $isth->fetchrow_arrayref) {
    print FILE JOIN ("\t",@$row),"\n";
}
但使用这种性能会受到影响

我不能使用dump_results()或dumper。将数千行数据转换为bcp数据文件格式将是一项额外的任务

如果有人能帮我决定最好的方法

PS:我是PERL新手。对不起,如果有一个明显的答案

#!/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

谢谢,但我最担心的是目标表中的列数和顺序可能会在我事先不知道的情况下更改。如何处理?@Gfx-使用
sqlcmd-Q“在选择“col1”时设置NOCOUNT,'col2'-Syour_server-dtempdb-E-W-h-1-s”“
获取当前列名列表,并在
SELECT
的下一步中使用它们以这样的顺序获取数据。如果以后添加或删除了某些列,则必须根据这些发现调整系统。