讨论贴:在sp_executesql 中生成的临时表的可见性

首先创建数据表

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‘.

他们的不同支出就是sql语句执行的先后顺序,

我的理解是:

对数据库上下文所做的更改只在 exec sp_executesql,或者是exec(‘....‘) 语句结束前有效。

如果临时表在sp_executesql前就生成了,那么它是乐意接收的,如果是先执行了sp_executesql来创建临时表,

当这个语句执行结束后,临时表也随即消失了。

期待听到更权威的解答。。。。。。

时间: 2024-10-10 00:25:27

讨论贴:在sp_executesql 中生成的临时表的可见性的相关文章

系统中生成编号/单号问题的实现方案讨论

应用场景 场景:对于大多数电商系统或财务系统来说,系统中的单号一般都不是从1开始的自增数字,而是一串有一定意义的字符串序列. 而往往这样的单号是要全局唯一的,不可重复. 那么,每次新增订单记录时,这个单号就要按照指定的规则来生成. 常见的订单号规则是字母前缀+日期+时间+定长的数字,如DD201610201559060001(format:XXYYYYMMDDHHmmssNNNN),PZ16102015000012(format:XXYYMMDDHHNNNNNN) 常见方案... 实现这样的场景

如何在高并发分布式系统中生成全局唯一Id(转)

http://www.cnblogs.com/heyuquan/p/global-guid-identity-maxId.html 又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了个MSSQL参数化语法生成器,会在9月整理出来,有兴趣的园友可以关注下我的博客. 分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案.我和我的小伙伴们也

【GlusterFS学习之四】:自动在volfile中生成需要的xlator

在上一篇文章中gluster xlator的设计中,讲到通过手动修改volfile来添加相应的xlator功能,但是实际上的需求是工程在建立好之后可以在创建卷的过程中自动在volfile中生成相应的xlator,本文将探讨这个问题. 一.volfile简介 本文主要讨论的是gluster的volfile,那么还是主要了解一下volfile的定义和意义,有两篇文章可以阅读: http://www.gluster.org/community/documentation/index.php/Under

如何在高并发分布式系统中生成全局唯一Id

我了解的方案如下-------------------------- 1.  使用数据库自增Id 优势:编码简单,无需考虑记录唯一标识的问题. 缺陷: 1)         在大表做水平分表时,就不能使用自增Id,因为Insert的记录插入到哪个分表依分表规则判定决定,若是自增Id,各个分表中Id就会重复,在做查询.删除时就会有异常. 2)         在对表进行高并发单记录插入时需要加入事物机制,否则会出现Id重复的问题. 3)         在业务上操作父.子表(即关联表)插入时,需要

如何在C#中生成与PHP一样的MD5 Hash Code

原文:如何在C#中生成与PHP一样的MD5 Hash Code 最近在对一个现有的系统进行C#改造,该系统以前是用PHP做的,后台的管理员登陆用的是MD5加密算法.在PHP中,要对一个字符串进行MD5加密非常简单,一行代码即可: md5("Something you want to encrypt.") 直接调用md5()方法,然后将要进行MD5加密的字符串传进去,就可以得到返回的hash code.在C#中应该也会有对应的算法吧!对吗?我首先尝试了下面的代码,结果得到的hash co

存储过程中游标和临时表的使用

游标: 游标一般用于把通过脚本得到的结果集的内容在用于其它的SQL语句中.但是游标执行会影响脚本执行速度,所以使用时请慎重. 在存储过程或触发器中使用 SQL 游标的典型过程为: 声明SQL 变量包含游标返回的数据.为每个结果集列声明一个变量.声明足够大的变量来保存列返回的值,并声明变量的类型为可从列数据类型隐式转换得到的数据类型. 使用 DECLARE CURSOR 语句将 SQL 游标与 SELECT 语句相关联.另外,DECLARE CURSOR 语句还定义游标的特性,例如游标名称以及游标

Linux中生成密钥的两种方法

Linux中生成密钥的两种方法 SSH服务支持一种安全认证机制,即密钥认证.所谓的密钥认证,实际上是使用一对加密字符串,一个称为公钥(publickey), 任何人都可以看到其内容,用于加密:另一个称为密钥(privatekey),只有拥有者才能看到,用于解密.通过公钥加密过的密文使用密钥可以轻松解密,但根据公钥来猜测密钥却十分困难. ssh的密钥认证就是使用了这一特性.服务器和客户端都各自拥有自己的公钥和密钥.如何使用密钥认证登录linux服务器呢? 在使用密钥认证远程登入linux之前,我们

在JavaScript中生成自定义的对象

使用对象便于组织信息.下面我们介绍如何在JavaScript中生成自定义的对象. ---------------------- JavaScript 对象 在前面几章中我们学到JavaScript中有些内置的对象,比如String, Date, Array等等.除此之外,你还可以定义自己的对象. 对象是一种特殊的数据,含有属性和函数. 下面让我们用一个例子来说明:比如一个人是一个对象.属性是与对象有联系的值,比如人的属性包括姓名,身高,体重,年龄,肤色,眼睛的颜色等等.所有人都有这些属性,但是每

FineUI之使用SQL脚本从数据库表中生成相应的输入控件

在WEB开发时,经常需要依据数据库表中的字段建立相应的输入控件,来获取输入的数据.每次都需要按字段来敲,显然太低效,而且容易出错.这里提供一个SQL脚本生成相应输入控件的方法. USE DBDemo DECLARE @TEMP_TABLE_NAME NVARCHAR(512) DECLARE @WIDTH NVARCHAR(50) SET @TEMP_TABLE_NAME='Stuff' SET @WIDTH='200' SELECT '<f:'+TOKEN+' runat="server