读书人

简单存储过程,报对像名无效解决方案

发布时间: 2012-01-10 21:26:50 作者: rapoo

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

读书人网 >SQL Server

热点推荐