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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 人工神经网络多层感知器_基于BP网络的多层感知器用来干嘛

    人工神经网络多层感知器_基于BP网络的多层感知器用来干嘛虽然异或问题成为感知器和早期神经网络的阿喀琉斯之踵,但它并非无解的问题。恰恰相反,解决它的思路相当简单,就是将单层感知器变成多层感知器。1,多层感知器(multilayerperceptron)包含一个或多个在输入节点和输出节点之间的隐藏层(hiddenlayer),除了输入节点外,每个节点都是使用非线性激活函数的神经元;2,多层感知器是一类前馈人工神经网络;3,多层感知器的训练包括以下步骤:首先确定给定输入和当前权重下的输出,再将输出和真实值相减得到误差函数,最后根据误差函数更新权重。在训练过程中

    2022年10月21日
    2
  • 软件缺陷报告[通俗易懂]

    软件缺陷报告[通俗易懂]1、定义概述:标识并描述发现的缺陷,具有清晰、完整和可重视问题所需的信息的文档理解:测试人员发现缺陷,记录,通过缺陷报告将缺陷报告给开发人员,并对缺陷进行跟踪管理。缺陷报告是测试人员与开发人员之间重要的沟通方式2、什么是缺陷软件缺陷就是通常说的Bug,它是指在软件中存在的影响软件正常运行的问题3、软件缺陷产生的原因1、需求不明确和变更软件需求不清晰或者开发人员对需求理解偏差,导致软件设…

    2022年9月18日
    2
  • vscode打个感叹号就出现html_为什么vscode输入叹号没反应

    vscode打个感叹号就出现html_为什么vscode输入叹号没反应关于Vscode自动更新后按!或按!+tab键不能自动生成html模板的问题和解决方法

    2022年8月22日
    91
  • dede list列表页和文章页分别使用if else

    dede list列表页和文章页分别使用if else

    2021年9月19日
    36
  • 性能优化之YUICompressor压缩JS、CSS

    性能优化之YUICompressor压缩JS、CSS性能一直是项目中比较重要的一点,尤其门户网站,对页面的响应要求是很高的,从性能角度上来讲,对于Web端的优化其中重要的一点无疑是JS、CSS文件压缩,图片的融合,尽量减小文件的大小,必免占加载时占用过多的带宽。yuicompressor无疑是一个比较好的压缩工具,是yahoo的一个开源组件,下面介绍yuicompressor压缩JS、CSS文件,及在项目中的使用yuicmpressor的使用1、首先

    2022年7月18日
    21
  • Java和JavaScript之间的区别

    Java和JavaScript之间的区别1.简介我们将在本文中比较Java语言和JavaScript语言。JavaScript由Netscape开发。它最初是用于客户端的脚本语言,后来又用作客户端和服务器脚本的语言。Java由JamesGosling由SunMicrosystems开发。这些天来,JavaScript在服务器中以node.js的形式使用。Java和JavaScript之间在程序编码,编译和运行方式方…

    2022年7月7日
    19

发表回复

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

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