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

SQL Server 2012 在sp_executesql 中生成的临时表的可见性在sql存储过程中,经常使用到动态sql语句,写法类似于这样Set@strParameter=N’@StartTimedatetime,@EndTimedatetime’Execsp_executesql@strSql,@strParameter,@StartTime,@EndTime为了满足业务需求,我们经常会在存储过程中使用到临时表。根据作用域的不同,分为全局临时表和用户临时

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

在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 TestTable GO CREATE TABLE TestTable(id INT IDENTITY(1,1),Info VARCHAR(10)) GO INSERT 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 TestTable EXEC('SELECT * FROM #temp')

–DROP TABLE #temp

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

Msg 208, Level 16, State 0, Line 2
Invalid object name '#temp'.

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • pycharm怎么添加项目_pycharm 其他

    pycharm怎么添加项目_pycharm 其他pycharm项目添加,在使用pycharm的过程中,有时想要在项目列表中展示多个项目需求第一种情况:原有项目的同级别目录展示另一个项目,如下面的截图操作路径:文件–打开–选择要添加的项目–点附加第二种情况:在原来的项目的主目录下添加拧一个项目,如下面的截图操作路径:文件–设置–项目–项目结构–添加内容根注意:以上两种添加方式:项目的根目录都是第一个项目创建时的根目录,查勘方式,点终端就会显示路径,这个路径也项目的…

    2022年8月25日
  • 原生JS 扫雷游戏 自动插旗子 自定义雷区大小 雷数可调

    原生JS 扫雷游戏 自动插旗子 自定义雷区大小 雷数可调《扫雷》是Microsoft于1992年附带在Windows3.1操作系统中的单机游戏,它通过点击方格并以出现数字来判断附近雷的数量,将全部地雷做上标记即可胜利。最后在2015年7月发布的Windows10中移除了这个游戏。随机变换雷区颜色,以及其它CSS样式,动画效果全是CSS。点击网页上的元素触发游戏事件打开雷区。如果对于一个方格,其周围未打开的方格恰好全都有雷,那么这些雷将全部自动被标记为小红旗,而玩家只需要一直点击雷区直至雷区全被打开并胜利呈现YOUWIN~没错,全程左键操作。在地

    2022年4月30日
  • IDEA这些既好用又好玩的三十多个宝贝插件你还不知道吗?「建议收藏」

    小编整理的一些好用的有趣的插件如果有什么问题,欢迎大家评论,群文件也有这些IDEA插件QQ交流群:99979568IDEA下载插件教程如果无法在线下载插件,文末有我下载好的安装包,以及安装包安装的教程强烈推荐的插件PresentationAssistant快捷键展示Codota代码智能提示AlibabaJavaCodeGuidelines—阿里巴巴Java代码规范Translation-必备的翻译插件SequenceDiagra.

    2022年4月8日
  • 分布式事务 java代码_Java分布式事务概念与实现示例[通俗易懂]

    分布式事务 java代码_Java分布式事务概念与实现示例[通俗易懂]在java中有如下三种事务,简单的JDBC级的事务JTA-在EJB环境下,用户得到事务并进行控制CMP-完全由容器控制事务,用户通过Bean配置文件来定义事务行为二三种都支持分布式事务,但只支持Java环境下的分布式事务。下面讨论如何在Java程序里实现分布式事务,即在同一个事务里访问多个数据源。实际上就是如何使用JTA.这里假设使用oracle数据库,使用webLogic部署应用,所要做…

    2022年5月8日
  • 抢先看:DHS和NIST发布IoT安全指南

    抢先看:DHS和NIST发布IoT安全指南

    2022年3月4日
  • Ubuntu安装与卸载tensorflow

    Ubuntu安装与卸载tensorflow安装sudopipinstalltensorflow-gpu==1.2卸载sudopipuninstalltensorflow-gputensorflow1.2.0配cuda8.0、cudnn5.1

    2022年6月22日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号