如何为多用户环境设计全局临时表的使用? (或替代方案)

问题描述 投票:0回答:3

我需要在我的一个存储过程中创建一个临时表。要插入到临时表中的数据源自动态数据透视查询 - 因此我与动态 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 - 透视查询不能以任何其他方式动态化,因为将透视的列是在运行时决定的。但我对数据实际进入临时表的方式很灵活。

编辑:编辑问题标题中的“变量”到“表”

sql sql-server t-sql pivot temp-tables
3个回答
1
投票

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

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

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


0
投票

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

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

希望对您有帮助


0
投票

您可以使用本地临时表,如下所示: (1) 创建本地临时表,例如:#tmp1 (2) 设置查询='插入#tmp1选择....'+pivotcols+ ' 来自基表 枢轴( 最大值(第 1 列) 对于第 2 列 ('+pivotcols+'作为最终'

执行(查询) -- 这里你可以使用#tmp1

© www.soinside.com 2019 - 2024. All rights reserved.