我在Sybase db中创建临时表时遇到问题。我们有一个sql,我们在其中创建一个临时表,将其插入/更新,并在结尾处从结果中进行选择*。我们正在使用spring jdbc tmplate从服务层调用此sql。第一次运行正常,但随后的后续运行失败,并显示错误
sleep()
这是我检查表是否存在的方式:
cannot create temporary table <name>. Prefix name is already in use by another temorary table
这里我想念什么吗?
答案 0 :(得分:1)
可能不是一个很好的回应,但是我也有这个问题,我有两种解决方法。 1.在查询之前将IF OBJECT_ID删除表作为一个单独的执行 2.在查询后立即执行不带IF OBJECT_ID()的删除表。
答案 1 :(得分:0)
您真的很接近,但临时表也需要使用db名称。
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
GO
如果要检查另一个数据库中是否存在用户表,那将是相同的。
IF OBJECT_ID('myDatabase..myTable') IS NOT NULL
DROP TABLE myDatabase..myTable
GO
答案 2 :(得分:0)
注意:有关BigDaddyO的第一个建议的更多信息...
您提供的代码片段在作为SQL批处理提交时,被解析为执行的之前的单个工作单元。最终结果是,如果在提交批处理时已经存在#temp_table
,则create table
命令的编译将产生错误。在下面的示例中可以看到此行为:
create table #mytab (a int, b varchar(30), c datetime)
go
-- your code snippet; during compilation the 'create table' generates the error
-- because ... at the time of compilation #mytab already exists:
if object_id('#mytab') is not NULL
drop table #mytab
create table #mytab (a int, b varchar(30), c datetime)
go
Msg 12822, Level 16, State 1:
Server 'ASE200', Line 3:
Cannot create temporary table '#mytab'. Prefix name '#mytab' is already in use by another temporary table '#mytab'.
-- same issue occurs if we pull the 'create table' into its own batch:
create table #mytab (a int, b varchar(30), c datetime)
go
Msg 12822, Level 16, State 1:
Server 'ASE200', Line 1:
Cannot create temporary table '#mytab'. Prefix name '#mytab' is already in use by another temporary table '#mytab'.
如BigDaddyO所建议,解决此问题的一种方法是将您的代码段分成两个单独的批次,例如:
-- test/drop the table in one batch:
if object_id('#mytab') is not NULL
drop table #mytab
go
-- create the table in a new batch; during compilation we don't get an error
-- because #mytab does not exist at this point:
create table #mytab (a int, b varchar(30), c datetime)
go