在DB Query之后写入文件的最佳方式,然后使用此文件作为BCP的数据文件

时间:2012-04-18 17:55:14

标签: perl perl-module

要求是将服务器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的新手。对不起,如果有明显的答案。

1 个答案:

答案 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