aar*_*ona 4 sql-server stored-procedures temp-tables
鉴于:
存储过程中的代码:
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')
Run Code Online (Sandbox Code Playgroud)
问题:
我无法重新创建这个临时表.我的工作是使用#tmpTable1,#tmpTable2,#tempTable3等.有没有办法解决这个问题?每次只使用一个临时表会很不错.
如果没有,这是什么原因?
Aar*_*and 11
正如我的评论所反映的,我将建议答案是您为您创建的每个对象使用不同的#temp表名.这有点像对医生说,"当我这样做时会疼." 他可能会做出反应,"停止这样做!"
这是一个问题的原因是SQL Server的解析器尝试一次性解析整个批处理.它可以清楚地看到你试图多次创建相同的#temp表,但是忽略了DROP
两者之间的命令(我无法确切地告诉你为什么会这样,因为我无法访问源代码).这与你不能这样做的原因相同:
IF (1=1)
CREATE TABLE #foo(i INT);
ELSE
CREATE TABLE #foo(i VARCHAR(32));
Run Code Online (Sandbox Code Playgroud)
解析器看到两个相同的名称,但不能真正遵循IF/ELSE
逻辑.
除了避免问题,多个同名的#temp表导致解析器,使用唯一名称的另一个好处是,如果不明确删除它们,它们可以重复使用.这将减轻tempdb在元数据/锁定方面的负担.
归档时间: |
|
查看次数: |
2148 次 |
最近记录: |