我需要在我的一个存储过程中创建一个临时表。要插入临时表的数据来自动态数据透视查询 - 因此我与动态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'
答案 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
希望它对你有所帮助