如何为多用户环境设计全局临时表的使用? (或替代方案)
我需要在我的存储过程之一中创建一个临时表。要插入到临时表中的数据源自动态数据透视查询 - 因此我与动态 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 - 透视查询不能以任何其他方式动态化,因为将透视的列是在运行时决定的。但我对数据实际进入临时表的方式很灵活。
编辑:编辑问题标题中的“变量”到“表”
I need to create a temporary table in one of my stored procedures. The data to be inserted into the temp table is derived from a dynamic pivot query - hence I am tied to dynamic sql. So it becomes something like this -
set query = 'select ....'+ pivotcols +
' into ##temp_table
from base_table
pivot (
max(col1)
for col2 in
(' + pivotcols +' as final'
exec(query)
Here I cannot use local temp table (#temp_table), since the table created within the dynamic sql won't be available to the rest of the stored procedure. So I end up using a global temp table (##temp_table).
Now the problem is if there is unforeseen exit from the stored proc where the table does not get dropped properly, it can raise exceptions when someone else tries to use the same sp. Also even without exceptions, if two people run the same procedure, there could be problems. Is there any solution to this problem? Any alternatives I can use?
Note: I have to use dynamic sql - the pivot query cannot be made dynamic in any other way, since the columns that will be pivoted are decided at runtime. But I am flexible to how the data actually goes into the temp table.
EDIT: edited 'variable' in the question heading to 'table'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以将从 GUID 派生的值附加到临时表名称。这是一种也删除连字符的方法。
NEWID() 每次都会给出不同的值。
You could append a value derived from a GUID to the temp table name. Here's one way that also removes the hyphens.
NEWID() will give a different value each time.
您可以使用以下 sql 语句检查全局临时表是否存在的条件。
希望对您有帮助
You can check condition that if global temporary table is exists using below sql statements.
Hope it will help for you
您可以按如下方式使用本地临时表:
(1) 创建本地临时表,例如:#tmp1
(2) 设置查询='插入#tmp1选择....'+pivotcols+
'
来自基表
枢轴(
最大值(第 1 列)
对于第 2 列
('+pivotcols+'asfinal'exec
(query)
-- 这里你可以使用#tmp1
You can use local temp table as follows:
(1) Create local temp table, ex: #tmp1
(2) set query = 'Insert into #tmp1 select ....'+ pivotcols +
'
from base_table
pivot (
max(col1)
for col2 in
(' + pivotcols +' as final'
exec(query)
-- Here you can use #tmp1