简单存储过程,报对像名无效
存储过程
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语句中有效