日期:2014-05-19  浏览次数:20664 次

简单存储过程,报对像名无效
存储过程
CREATE   PROC   TEST

AS

DECLARE   @SQL   NVARCHAR(4000)
SET   @SQL= 'SELECT   *   INTO   #TMP   FROM   返工表   '
EXEC   sp_executesql   @SQL
SELECT   *   FROM   #TMP


在查询分析器中执行报错:

(所影响的行数为   644   行)

服务器:   消息   208,级别   16,状态   1,过程   TEST,行   8
对象名   '#TMP '   无效。
存储过程:   dx2007.dbo.TEST
 
但我直接在分析器中运行:

SET   @SQL= 'SELECT   *   INTO   #TMP   FROM   返工表   '
EXEC   sp_executesql   @SQL
SELECT   *   FROM   #TMP

是没有问题的,临时表为何不能访问呢?

------解决方案--------------------
生命周期
------解决方案--------------------
作用域
------解决方案--------------------
作用域不同

CREATE PROC TEST

AS

DECLARE @SQL NVARCHAR(4000)
SET @SQL= 'SELECT * INTO #TMP FROM 返工表;SELECT * FROM #TMP '
EXEC sp_executesql @SQL

------解决方案--------------------

我不相信在查询分析器里执行不会报错
------解决方案--------------------

作用域的问题
------解决方案--------------------
CREATE PROC TEST

AS
SSELECT * INTO #TMP FROM 返工表
SELECT * FROM #TMP

这样就没问题了
------解决方案--------------------
#TMP作用域只限于当前查询 而sp_executesql @SQL 和 SELECT * FROM #TMP不属于一次查询所以抱错
------解决方案--------------------
作用域的问题


CREATE PROC TEST

AS

DECLARE @SQL NVARCHAR(4000)
SET @SQL= 'SELECT * INTO #TMP FROM 返工表 SELECT * FROM #TMP '
EXEC sp_executesql @SQL
go

--或者


CREATE PROC TEST

AS
SELECT * INTO #TMP FROM 返工表 where 1=2

DECLARE @SQL NVARCHAR(4000)
SET @SQL= 'insert INTO #TMP SELECT * FROM 返工表 '
EXEC sp_executesql @SQL

SELECT * FROM #TMP
go

------解决方案--------------------
这样改一下就行了

alter PROC TEST

AS

DECLARE @SQL NVARCHAR(4000)
SET @SQL= 'SELECT * INTO #TMP FROM gzda select * from #tmp '
EXEC sp_executesql @SQL

go

exec test
------解决方案--------------------
#tmp只在动态sql语句中有效