子存储过程不能引用父存储过程创建一个本地临时表(Child sProc cannot referen

2019-10-22 03:41发布

我们的生产SQL2000例如,我们有数以百计的存储过程,其中有许多在代码上使用创建#TEMP表“早”的技术,然后各种内部存储过程得到由该父存储过程执行的数据库。 在SQL2000,内部或“儿童”的存储过程没有问题,插入#TEMP或#TEMP选择数据。 总之,我认为它们都可以参考这个#TEMP,因为它们使用相同的连接。

在与SQL2008测试,我发现2个表现不同的行为。 首先,在设计时,新的“智能感知”功能在存储过程儿童的管理工作室编辑抱怨#TEMP是“无效的对象名称”。 但糟糕的是,在执行时,调用存储过程父嵌套子存储过程中失败。

有人认为,解决的办法就是改变## TEMP这显然是可以从不同的连接中引用全局临时表。

这似乎无论从工作量过于激烈的建议追下去所有的问题点,以及当这些存储过程是从Web应用程序(即多用户的问题)调用可能/可能讨厌的影响。

是关于#TEMP(本地临时表)的行为,这确实是一个改变SQL2005或SQL2008? 我们跳过了2005年,但我想了解更多正是为什么这是发生在我走之前关闭,并尝试破解出所需要的修复。 谢谢。

Answer 1:

共享存储过程之间的临时表是一个很好的功能使用: 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)


Answer 2:

我们现在做到这一点(2000年,2005年,和2008年),完全按照你的描述,而无需更改本地到全局临时表。



文章来源: Child sProc cannot reference a Local temp table created in parent sProc