我们的生产SQL2000例如,我们有数以百计的存储过程,其中有许多在代码上使用创建#TEMP表“早”的技术,然后各种内部存储过程得到由该父存储过程执行的数据库。 在SQL2000,内部或“儿童”的存储过程没有问题,插入#TEMP或#TEMP选择数据。 总之,我认为它们都可以参考这个#TEMP,因为它们使用相同的连接。
在与SQL2008测试,我发现2个表现不同的行为。 首先,在设计时,新的“智能感知”功能在存储过程儿童的管理工作室编辑抱怨#TEMP是“无效的对象名称”。 但糟糕的是,在执行时,调用存储过程父嵌套子存储过程中失败。
有人认为,解决的办法就是改变## TEMP这显然是可以从不同的连接中引用全局临时表。
这似乎无论从工作量过于激烈的建议追下去所有的问题点,以及当这些存储过程是从Web应用程序(即多用户的问题)调用可能/可能讨厌的影响。
是关于#TEMP(本地临时表)的行为,这确实是一个改变SQL2005或SQL2008? 我们跳过了2005年,但我想了解更多正是为什么这是发生在我走之前关闭,并尝试破解出所需要的修复。 谢谢。
共享存储过程之间的临时表是一个很好的功能使用: 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)
我们现在做到这一点(2000年,2005年,和2008年),完全按照你的描述,而无需更改本地到全局临时表。