在我们的生产SQL2000实例上,我们有一个包含数百个存储过程的数据库,其中许多使用在代码中“早期”创建#TEMP表的技术,然后各个内部存储过程由此父级sProc获取EXECUTEd 。在SQL2000中,内部或“子”sProc插入#TEMP或从#TEMP中选择数据没有问题。简而言之,我认为他们都可以参考这个#TEMP,因为他们使用相同的连接。
在使用SQL2008进行测试时,我发现了两种不同行为的表现形式。首先,在设计时,新的“intellisense”功能在子级sProc的Management Studio EDIT中抱怨#TEMP是“无效的对象名称”。但更糟糕的是,在执行时,被调用的父sProc在嵌套子sProc中失败。
有人建议解决方法是更改为## TEMP,这显然是一个可以从不同连接引用的全局临时表。
当从Web应用程序调用这些sProcs(即多用户问题)时,这个问题似乎过于激烈,无论是从追查所有问题点的工作量以及可能/可能的讨厌效果来看。
对于#TEMP(本地临时表),这确实是SQL2005或SQL2008中行为的变化吗?我们跳过2005年但是我想更准确地了解为什么在我出发之前发生这种情况并试图破解所需的修复。谢谢。
答案 0 :(得分:2)
在存储过程之间共享临时表是一个很好用的功能:http://www.sommarskog.se/share_data.html#temptables,我很惊讶它不适合你。也许您应该尝试一个非常简单的示例,看看是否可行。然后,如果这工作开始考虑其他原因。
在management studio的查询窗口中尝试:
创建这两个程序:
CREATE PROCEDURE called_procedure
(@par1 int, @par2 char(5))
AS
INSERT INTO #tmp VALUES (@par1,@par2)
GO
CREATE PROCEDURE caller
AS
CREATE TABLE #tmp (col1 int NOT NULL
,col2 char(5) NULL
)
EXEC called_procedure 1, 'AAA'
EXEC called_procedure 2, 'BBB'
SELECT * FROM #tmp
GO
然后运行它们:
exec caller
这是我在SQL Server 2005上获得的:
col1 col2
----------- -----
1 AAA
2 BBB
(2 row(s) affected)
答案 1 :(得分:1)
我们现在(在2000年,2005年和2008年)完全按照您的描述执行此操作,而无需更改本地临时表。