Given:
存储过程中的代码:
select bleh
into #tblTemp
from FunctionThatReturnsTable('some','params')
-- do some stuff
drop table #tblTemp
-- Error on this command:
-- 'There is already an object named '#tblTemp' in the database.'
select bleh
into #tblTemp
from FunctionThatReturnsTable('some','other params')
Problem:
我无法重新创建此临时表。我的解决方法是使用 #tmpTable1、#tmpTable2、#tempTable3 等。有没有办法解决这个问题?每次只使用一个临时表就好了。
如果不是,原因是什么?
正如我的评论所反映的,我建议答案是为您创建的每个对象使用不同的 #temp 表名称。这有点像对医生说:“我这样做时会很痛。”他可能的反应是:“停止这样做!”
这是一个问题的原因是 SQL Server 的解析器尝试一次性解析整个批次。它可以清楚地看到您试图多次创建相同的#temp表,但忽略了DROP
之间的命令(我无法确切地告诉你这是为什么,因为我无权访问源代码)。这与您不能执行此操作的原因相同:
IF (1=1)
CREATE TABLE #foo(i INT);
ELSE
CREATE TABLE #foo(i VARCHAR(32));
解析器看到两个相同的名称,但无法真正遵循IF/ELSE
logic.
除了避免多个同名#temp 表给解析器带来的问题之外,使用唯一名称的另一个好处是它们can如果您没有明确删除它们,则可以重复使用它们。这将减轻 tempdb 在元数据/锁定方面的负载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)