我正在使用sybase临时表方法(#表名)进行批量插入。这发生在交易中。但是,此操作是提交数据事务。 (我自己没有联系)。我不希望发生这种提交,因为我可能不得不稍后回滚整个事务。任何想法为什么插入使用临时表提交事务是否应该被问到?我该如何解决这个问题?
sql就像
select * into #MY_TABLE_BUFFER from MY_TABLE where 0=1;
load table #MY_TABLE_BUFFER from 'C:\temp\123.tmp' WITH CHECKPOINT ON;
insert into MY_TABLE on existing update select * from #MY_TABLE_BUFFER;
drop table #MY_TABLE_BUFFER;
我正在使用statement.executeUpdate()
来执行它
弄清楚它是由于临时表没有参与事务并进行提交。 有没有解决方法呢?
答案 0 :(得分:4)
Sybase使用#temp表(在事务中创建临时表时),结合使用用户指定的(也就是显式的)事务很有趣。无论好坏,Sybase都认为#temp表(包括通过'select into'语句)的创建是tempdb上下文中的DDL语句。在编辑器中,使用默认的服务器/数据库设置,执行此操作时会出现错误。
作为测试,您可以尝试将'ddl in tran'设置(在tempdb数据库的上下文中)设置为true。然后,查看行为是否发生变化。
但请注意,永久保留该设置是个坏主意(根据Sybase文档)。我建议它仅用于调查目的。
真正的解决方案(如果我对问题的假设是正确的)可能在于首先创建#temp表,然后开始事务,以避免事务范围内的任何DDL stmts。
答案 1 :(得分:0)
sp_dboption tempdb,'ddl in tran',true
以上的shuld工作,甚至在使用anymode创建proc时也无法创建/更新#tables。