在sybase中创建临时表

时间:2018-08-15 15:38:19

标签: sybase temp-tables sybase-ase

我在Sybase db中创建临时表时遇到问题。我们有一个sql,我们在其中创建一个临时表,将其插入/更新,并在结尾处从结果中进行选择*。我们正在使用spring jdbc tmplate从服务层调用此sql。第一次运行正常,但随后的后续运行失败,并显示错误

sleep()

这是我检查表是否存在的方式:

cannot create temporary table <name>. Prefix name is already in use by another temorary table

这里我想念什么吗?

3 个答案:

答案 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