前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL Server 2012 在sp_executesql 中生成的临时表的可见性

SQL Server 2012 在sp_executesql 中生成的临时表的可见性

作者头像
全栈程序员站长
发布2022-08-31 17:37:20
8340
发布2022-08-31 17:37:20
举报

大家好,又见面了,我是你们的朋友全栈君。

在sql存储过程中,经常使用到动态sql语句,写法类似于这样

代码语言:javascript
复制
Set @strParameter=N'@StartTime datetime,@EndTime datetime'
Exec sp_executesql @strSql,@strParameter,@StartTime,@EndTime    

为了满足业务需求,我们经常会在存储过程中使用到临时表。根据作用域的不同,分为全局临时表和用户临时表。

如果在动态sql语句中构造了用户临时表,代码如下:

代码语言:javascript
复制
exec SP_EXECUTESQL N'SELECT * INTO #temp FROM TestTable' 
SELECT * FROM #temp

执行后会报如下错误

代码语言:javascript
复制
消息 208,级别 16,状态 0,第 37 行
对象名 '#temp' 无效。

在ssms中调试,执行到该动态SQL语句时 会出现异常“未将对象设置引用到对象实例” 这是由于临时表只存在于动态sql这个作用域内,也就是只在动态SQL可见,在当前存储过程中是不可见的,所以会出现找不到该临时表的错误。

首先创建测试表

代码语言:javascript
复制
IF object_id('TestTable') IS NOT NULL
    DROP TABLE TestTable GO CREATE TABLE TestTable(id INT IDENTITY(1,1),Info VARCHAR(10)) GO INSERT TestTable SELECT 'a' UNION ALL SELECT 'b' GO

然后依次执行以下三个脚本

脚本一:

代码语言:javascript
复制
EXEC('SELECT * INTO #temp FROM TestTable')
SELECT * FROM #temp

脚本二:

代码语言:javascript
复制
exec SP_EXECUTESQL N'SELECT * INTO #temp FROM TestTable' 
SELECT * FROM #temp

脚本三:

代码语言:javascript
复制
SELECT * INTO #temp FROM TestTable EXEC('SELECT * FROM #temp')

–DROP TABLE #temp

执行后发现只有脚本三是成功的,其他连个脚本执行后都会提示:

代码语言:javascript
复制
Msg 208, Level 16, State 0, Line 2
Invalid object name '#temp'.

知道了问题出现的原因,解决方案很简单,将用户临时表替换为全局临时表就ok了,也就是在#temp前再加个‘#’,即 ##Temp

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143569.html原文链接:https://javaforall.cn

如果您是在找激活码,但输入激活码后激活失败,最新激活码地址:https://javaforall.cn/127239.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先创建测试表
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档