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)
上一篇 2022年5月21日 下午12:00
下一篇 2022年5月21日 下午12:00


相关推荐

  • 工程实践_Ubuntu16.04使用whl文件安装PyTorch教程

    工程实践_Ubuntu16.04使用whl文件安装PyTorch教程首先下载 PyTorch 的 whl 文件我们可以使用清华源中的下载资源 武林秘籍 可以使用迅雷下载 速度很快 清华源 PyTorch 库安装 PyTorchpipin whlpipinstal 验证安装结果在终端输入如下命令 pythonimport torch version 即可验证 PyTorch 是否安装成功 还能查看 Pytorch 版本

    2026年3月26日
    2
  • 自动加密web.config配置节批处理

    自动加密web.config配置节批处理

    2021年7月22日
    72
  • TOP命令详解(TOP10)

    原文http://rockhooray.blog.51cto.com/938613/832621一概述在终端中可以查看top命令的路径和所属软件包。top程序对运行的系统提供一个动态的实时的监控。它能够显示系统的总体信息和一些正被Linux内核管理的任务。它所显示的系统总体信息的样式以及任务信息显示的样式,顺序和大小都是可以由用户配置,而且配置信息可以重启后永久生

    2022年4月11日
    238
  • asp.net MVC简单图片上传

    asp.net MVC简单图片上传asp.netMVC简单图片上传01、创建控制器HomeController.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespacemvcTuPianShangChuang.Controllers{publicclassHomeController:Controller{

    2022年7月22日
    10
  • 常用Java编程软件有哪些[通俗易懂]

    常用Java编程软件有哪些[通俗易懂]很多想学Java的人想知道常用的Java编程软件有哪些,毕竟只有掌握软件才能更好的工作。然而,只掌握软件工具并不够,你还需要具备一定的知识基础,更要熟练掌握各个软件的应用,常用的Java编程软件有哪些?1、IntelliJIDEAIntelliJIDEA是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、创新的GUI设计等方面的功能可以说

    2022年7月7日
    50
  • 1M等于多少字节[通俗易懂]

    1M等于多少字节[通俗易懂]1M=1024k=1048576字节算法是:1Byte(字节)=8bit(位)1KB=1024Byte(字节)1MB=1024KB1GB=1024MB1TB=1024GB一个汉字要占用2个字节如果换算成中文汉字那么就是1M=524288个汉字…

    2022年5月26日
    100

发表回复

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

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