如何为多用户环境设计Global temp table的用法? (或替代品)

时间:2010-11-27 05:37:13

标签: sql sql-server tsql pivot temp-tables

我需要在我的一个存储过程中创建一个临时表。要插入临时表的数据来自动态数据透视查询 - 因此我与动态sql绑定。所以它变成了这样的东西 -

set query = 'select ....'+ pivotcols + 
            ' into ##temp_table
              from base_table
              pivot (
              max(col1)
              for col2 in 
              (' + pivotcols +' as final'

 exec(query)

这里我不能使用本地临时表(#temp_table),因为在动态sql中创建的表将不可用于存储过程的其余部分。所以我最终使用全局临时表(## temp_table)。

现在的问题是,如果存储过程中出现无法预料的退出,表中没有正确删除表,当其他人尝试使用相同的sp时,它可能引发异常。即使没有例外,如果两个人运行相同的程序,可能会有问题。有没有解决这个问题的方法?我可以使用任何替代方案吗?

注意:我必须使用动态sql - 不能以任何其他方式使数据透视查询动态化,因为将在运行时决定将被旋转的列。但我对数据实际进入临时表的方式很灵活。

编辑:在问题标题中编辑'变量'到'table'

2 个答案:

答案 0 :(得分:1)

您可以将从GUID派生的值附加到临时表名称。这是一种也删除连字符的方法。

set query = 'select ....'+ pivotcols + 
            ' into ##temp_table' + REPLACE(CAST(NEWID() as varchar(50)), '-','')

NEWID()每次都会给出不同的值。

答案 1 :(得分:0)

您可以使用以下sql语句检查条件是否存在全局临时表。

IF OBJECT_ID('##temp') IS NOT NULL
drop table ##temp

希望它对你有所帮助