SQL Server 2012 在sp_executesql 中生成的临时表的可见性
来源:互联网 发布:西安千度网络传销 编辑:程序博客网 时间:2024/06/14 18:29
在sql存储过程中,经常使用到动态sql语句,写法类似于这样
Set @strParameter=N'@StartTime datetime,@EndTime datetime'Exec sp_executesql @strSql,@strParameter,@StartTime,@EndTime
为了满足业务需求,我们经常会在存储过程中使用到临时表。根据作用域的不同,分为全局临时表和用户临时表。
如果在动态sql语句中构造了用户临时表,代码如下:
exec SP_EXECUTESQL N'SELECT * INTO #temp FROM TestTable' SELECT * FROM #temp
执行后会报如下错误
消息 208,级别 16,状态 0,第 37 行对象名 '#temp' 无效。
在ssms中调试,执行到该动态SQL语句时
会出现异常“未将对象设置引用到对象实例”
这是由于临时表只存在于动态sql这个作用域内,也就是只在动态SQL可见,在当前存储过程中是不可见的,所以会出现找不到该临时表的错误。
首先创建测试表
IF object_id('TestTable') IS NOT NULL DROP TABLE TestTableGOCREATE TABLE TestTable(id INT IDENTITY(1,1),Info VARCHAR(10))GOINSERT TestTable SELECT 'a'UNION ALL SELECT 'b'GO
然后依次执行以下三个脚本
脚本一:
EXEC('SELECT * INTO #temp FROM TestTable')SELECT * FROM #temp
脚本二:
exec SP_EXECUTESQL N'SELECT * INTO #temp FROM TestTable' SELECT * FROM #temp
脚本三:
SELECT * INTO #temp FROM TestTableEXEC('SELECT * FROM #temp')
–DROP TABLE #temp
执行后发现只有脚本三是成功的,其他连个脚本执行后都会提示:
Msg 208, Level 16, State 0, Line 2Invalid object name '#temp'.
知道了问题出现的原因,解决方案很简单,将用户临时表替换为全局临时表就ok了,也就是在#temp前再加个‘#’,即 ##Temp
阅读全文
0 0
- SQL Server 2012 在sp_executesql 中生成的临时表的可见性
- SQL SERVER本地临时表的可见范围小探
- SQL Server中临时表的建立
- sql server生成临时表的快捷方法
- SQL Server EXEC和sp_executesql的区别
- SQL Server EXEC和sp_executesql的区别
- SQL Server EXEC和sp_executesql的区别
- ms sql server exec sp_executesql的区别
- SQL Server EXEC和sp_executesql的区别
- 临时表在SQL Server和MySql中创建的方法
- 临时表在SQL Server和MySql中创建的方法
- SQL Server中临时表与表变量的区别
- SQL Server中临时表与表变量的区别
- SQL Server中临时表与表变量的区别
- SQL Server中临时表与表变量的区别
- SQL Server中临时表与表变量的区别
- SQL Server中临时表与表变量的区别
- SQL Server中临时表与表变量的区别
- JavaEE开发之Spring中的条件注解、组合注解与元注解
- git常用命令
- ruby中的整数、浮点数、字符串之间的相互转换
- Delphi检测字符串中是否包含汉字
- struts2__result元素,各种情况下的转发与重定向
- SQL Server 2012 在sp_executesql 中生成的临时表的可见性
- 输入框智能提示(二)
- element.src.match("bulbon")什么作用?
- UVA 10054
- Android wifi源码分析(一) Wifi启动流程
- C++学习之路(11)---什么是引用?
- 单击 双击冲突解决
- codeforces 848B :计数
- Leetcode 92