我有一个多用户ASP.NET应用程序针对SQL Server运行,并希望有StoredProcA创建#temptable临时表 - 不表变量 - 插入一些数据,然后跳转到StoredProcB,StoredProcC和StoredProcD操纵数据每个业务规则#temptable。
交谈时,SQL Web应用程序使用连接池。 我会得到StoredProcA的每个调用一个新的#temptable刮开区? 或将连接池共享用户之间的#temptable?
我有一个多用户ASP.NET应用程序针对SQL Server运行,并希望有StoredProcA创建#temptable临时表 - 不表变量 - 插入一些数据,然后跳转到StoredProcB,StoredProcC和StoredProcD操纵数据每个业务规则#temptable。
交谈时,SQL Web应用程序使用连接池。 我会得到StoredProcA的每个调用一个新的#temptable刮开区? 或将连接池共享用户之间的#temptable?
连接池(任何现代版本的SQL Server)将调用sp_reset_connection
重用连接时。 这个存储过程,除其他事项外, 丢弃所有的临时表的连接拥有。
一个##表格将被所有用户共享。 我想这是不是你的意图。
一种单一#临时表是可见的下降调用堆栈的所有存储过程,但范围之外不可见。 如果你能有程序A调用B,C,和d,你应该确定。
编辑:我应该现在工作的报告程序是很象。 :)我创建临时表(#results)根PROC那年代由应用程序调用,然后做一些复杂的数据在一系列的子流程重整,1)抽象重复的代码,以及2)养根程序运行到500以上线。
#temptable
撑不下去了过去在它被宣告程序的结束,因此它永远不会被其他用户看到。
编辑:嘿,原来是因为SQL Server 7.0的临时表的“嵌套可见性”工作过,但我从来没有更新我的任何代码,利用这一优势。 我想我自己约会 - 很多人可能无法想象那是在6.0为6.5天SQL Server中的地狱......
从MS文档:
http://msdn.microsoft.com/en-us/library/ms177399(SQL.90).aspx
临时表
临时表类似于永久表,但临时表存储在tempdb数据库,并自动删除,当他们不再使用。
有两种类型的临时表:本地和全局。 他们互相在他们的名字,他们的知名度,其可用性有所不同。 本地临时表有一个单一的数字符号(#)作为其名称的第一个字符; 它们仅显示给用户的当前连接,当用户从SQL Server实例断开它们将被删除。
全局临时表有两个数字符号(##)作为其名称的第一个字符; 他们是在创建之后的任何用户可见的,并且它们被删除时,所有用户都引用从SQL Server实例的表断开。
例如,如果您创建表的员工,该表可通过谁在使用它的数据库中的安全权限的任何人使用,直到表被删除。 如果数据库会话创建本地临时表#employees,只有会话可以与工作表中,并删除该会话断开连接时。 如果创建全局临时表的##名员工,在数据库中的任何用户都可以使用该工作表中。 如果没有其他用户使用此表创建后它的工作原理,当你断开表被删除。 如果另一个用户与该表在创建之后它的工作原理,SQL服务器断开,并在所有其他会话不再积极使用后删除。
另外从科特谁纠正我的方式错误,并以防万一你错过注释引文:
http://msdn.microsoft.com/en-us/library/ms191132.aspx
如果您创建一个存储过程中的局部临时表,该临时表只存在于存储过程的目的; 当你退出该存储过程中消失。
如果执行调用另一个存储过程的存储过程,被调用存储过程可以访问由第一个存储过程,包括临时表创建的所有对象。
为了与用户使用的名称## like_this前两个散列共享一个临时表。
在这种情况下,虽然确保你采取措施,以避免与程序的多个实例冲突。
临时表获取具有名称引擎盖下的重整生成所以不应该有不同的存储过程调用之间的冲突。
如果您需要处理在随后的存储过程调用同样的温度数据,这是最好的只是一个真正的表去使用某种唯一标识符,以确保您只处理相关数据。 如果数据是唯一有价值的是暂时的,手动删除它,一旦你就大功告成了。