使用dbh句柄创建的perl-dbi #temp表通过 - > do()使用相同句柄访问时无法访问

时间:2011-08-04 12:12:16

标签: database perl sql-server-2008 transactions

我正面临这个问题perl DBD::ODBC rollback ineffective with AutoCommit enabled at,在查看问题的同时,我发现一个非常基本的事情是使用Perl :: DBI在sql server上使用DBD :: ODBC失败。但我不确定这是否会与其他任何司机发生。

问题是,当我使用$ dbh-> do创建#temp表时,当我尝试使用另一个$ dbh-> do来访问相同的#temp表时,我收到以下错误。这也不会一直发生,而只是间歇性地发生。

无效的对象名称'#temp'

$dbh->do("SELECT  ... INTO #temp FROM ...");
$dbh->do("INSERT INTO ... SELECT ... FROM #temp");
  

第二次失败时出现'无效的对象名'#temp''

请帮助我解决问题。

2 个答案:

答案 0 :(得分:1)

不是它回答了你的问题,但它可能有所帮助。以下适用于我。

#
# To access temporary tables in MS SQL Server they need to be created via
# SQLExecDirect
#
use strict;
use warnings;
use DBI;

my $h = DBI->connect();

eval {
    $h->do(q{drop table martin});
    $h->do(q{drop table martin2});
};

$h->do(q{create table martin (a int)});
$h->do(q{create table martin2 (a int)});

$h->do('insert into martin values(1)');

my $s;
# this long winded way works:
#$s = $h->prepare('select * into #tmp from martin',
#                    { odbc_exec_direct => 1}
#);
#$s->execute;
# and this works too:
$h->do('select * into #tmp from martin');
# but a prepare without odbc_exec_direct would not work

print "NUM_OF_FIELDS: " . DBI::neat($s->{NUM_OF_FIELDS}), "\n";

$s = $h->selectall_arrayref(q{select * from #tmp});
use Data::Dumper;
print Dumper($s), "\n";

$h->do(q/insert into martin2 select * from #tmp/);
$s = $h->selectall_arrayref(q{select * from martin2});
print Dumper($s), "\n";

答案 1 :(得分:1)

我也有这个问题。我尝试了以上所有但是没关系。我偶然发现了http://bytes.com/topic/sql-server/answers/80443-creating-temporary-table-select-into这解决了我的问题。

  

正在发生的事情是ADO正在打开第二个连接   你的背部。这与你如何创建它没有任何关系   表

     

ADO打开额外连接的原因是因为有   等待在第一个连接上获取的行,因此ADO不能   提交关于该连接的查询。

我认为Perl DBI正在做同样的事情,所以基于这个假设,这就是我所做的,它完美地工作:

 my $sth = $dbh->prepare('Select name into #temp from NameTable');
 $sth->execute();
 $sth->fetchall_arrayref();
 $sth = $dbh->prepare('Select a.name, b.age from #temp a, AgeTable b where a.name = name');
 $sth->execute();
 my ($name,$age)
 $sth->bind_columns(\$name,\$age);
 while ( $sth->fetch())
 {
     # processing
 }