我需要在我的一个存储过程中创建一个临时表。要插入到临时表中的数据源自动态数据透视查询 - 因此我与动态 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 - 透视查询不能以任何其他方式动态化,因为将透视的列是在运行时决定的。但我对数据实际进入临时表的方式很灵活。
编辑:编辑问题标题中的“变量”到“表”
您可以将从 GUID 派生的值附加到临时表名称。这是一种也可以删除连字符的方法。
set query = 'select ....'+ pivotcols +
' into ##temp_table' + REPLACE(CAST(NEWID() as varchar(50)), '-','')
NEWID() 每次都会给出不同的值。
您可以使用以下sql语句检查全局临时表是否存在的条件。
IF OBJECT_ID('##temp') IS NOT NULL
drop table ##temp
希望对您有帮助
您可以使用本地临时表,如下所示: (1) 创建本地临时表,例如:#tmp1 (2) 设置查询='插入#tmp1选择....'+pivotcols+ ' 来自基表 枢轴( 最大值(第 1 列) 对于第 2 列 ('+pivotcols+'作为最终'
执行(查询) -- 这里你可以使用#tmp1