尝试使用Perl DBI从数据库中选择大文本字段,它只选择第一个位

时间:2016-06-16 19:12:47

标签: sql sql-server perl dbi

我正在使用Perl解析大量富文本“文件”(存储为ntext - 对我来说几乎是个谜的数据类型),它们存在于SQL Server数据库中,我很陌生,之前只与Oracle合作过。但是,我只从每个文件中获取前40个字符。每个文件都是这样的:

{\rtf1\sste17000\ansi\deflang1033\ftnbj\uc1\deff0 {\fonttbl{\f0 \fswiss Arial;} etc.

但是当我从Perl中选择时,他们会这样切断:

{\rtf1\sste17000\ansi\deflang1033\ftnbj

以下是我现在的代码(为简洁起见,显式简化了选择语句):

my $dbh = DBI->connect("dbi:ODBC:Driver={SQL Server};Server=$server;UID=$user;PWD=$password")
    or die "Can't connect to server: $DBI::errstr";

my $sth = $dbh->prepare("select note_txt from database")
    or die "Couldn't prepare statement: " . $dbh->errstr;
my @data;

$sth->execute()
    or die "Couldn't execute statement: " . $sth->errstr;

$sth->{'LongTruncOk'} = 1;
$sth->{'LongReadLen'} = 2000;
while (@data = $sth->fetchrow_array()) {
    my $note = $data[0];
    parse_note($note);
}

为什么它只给我第一个~40个字符,我怎样才能得到整个文本?

谢谢!

1 个答案:

答案 0 :(得分:1)

我在DBI :: ODBC上遇到了类似的问题,我会更改数据库句柄上的代码,而不是语句句柄。使用你的代码现在看起来像这样(注意LongReadLen已在代码中向上移动,我建议使用数据库句柄$dbh,而不是语句句柄$sth):

my $dbh = DBI->connect("dbi:ODBC:Driver={SQL Server};Server=$server;UID=$user;PWD=$password")
    or die "Can't connect to server: $DBI::errstr";

$dbh->{LongTruncOk} = 1;
$dbh->{LongReadLen} = 2000;

my $sth = $dbh->prepare("select note_txt from database")
    or die "Couldn't prepare statement: " . $dbh->errstr;
my @data;

$sth->execute()
    or die "Couldn't execute statement: " . $sth->errstr;

while (@data = $sth->fetchrow_array()) {
    my $note = $data[0];
    parse_note($note);
}

您可能还想将$dbh->{'LongReadLen'} = 2000;调整为更高。当然,每种情况都不同,但就我而言,我使用的是16K,即$dbh->{'LongReadLen'} = 16384;

这里还有一个小代码存根,其中包含编程Perl DBI 一书中的注释:

$dbh->{LongReadLen} = 512 * 1024;  ### We are interested in the first 512 KB of data
$dbh->{LongTruncOk} = 1;    ### We're happy to truncate any excess

注意:我也不相信单引号是必要的。因此$dbh->{'LongReadLen'}变为$dbh->{LongReadLen} 此外,如评论中的用户 @ThisSuitIsBlackNot 所述,请参阅DBI docs以获取进一步的说明和信息。