我正面临这个问题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''
请帮助我解决问题。
答案 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
}