SQL Server临时表和连接池

时间:2008-09-26 20:20:58

标签: sql-server sql-server-2005

我有一个针对SQL Server运行的多用户ASP.NET应用程序,并希望让StoredProcA创建一个#temptable临时表 - 而不是表变量 - 来插入一些数据,然后分支到StoredProcB,StoredProcC和StoredProcD进行操作每个业务规则的#temptable中的数据。

与SQL交谈时,Web应用程序使用连接池。我是否会为每次调用StoredProcA获得一个新的#temptable临时区域?或者连接池是否在用户之间共享#temptable?

6 个答案:

答案 0 :(得分:41)

连接池(使用任何现代版本的SQL Server)将在重用连接时调用sp_reset_connection。这个存储过程包括连接所拥有的drops any temporary tables

答案 1 :(得分:6)

所有用户都将共享##表。我认为这不是你的意图。

单个#temp表对于调用堆栈下的所有存储过程是可见的,但在该范围之外不可见。如果您可以使用Proc A呼叫B,C和D,那么您应该没问题。

编辑:我现在应该处理的报告程序非常类似。 :)我在应用程序调用的根proc中创建一个临时表(#results),然后在一系列子程序中执行一些复杂的数据修改,1)抽象重复代码,以及2)保持root程序不运行超过500行。

答案 2 :(得分:3)

#temptable不会在声明它的过程结束后继续存在,因此其他用户将永远不会看到它。

编辑:嘿,事实证明,自SQL Server 7.0以来,临时表的“嵌套可见性”已经起作用,但我从未更新任何代码以利用此功能。我想我正在约会自己 - 很多人可能无法想象在6.0和6.5天内SQL Server的地狱......

答案 3 :(得分:2)

来自MS docs:

http://msdn.microsoft.com/en-us/library/ms177399(SQL.90).aspx

临时表

临时表类似于永久表,但临时表存储在tempdb中,并在不再使用时自动删除。

有两种类型的临时表:本地和全局。它们的名称,可见性和可用性各不相同。 本地临时表有一个数字符号(#)作为其名称的第一个字符;它们仅对用户的当前连接可见,并且在用户与SQL Server实例断开连接时将被删除。

全局临时表有两个数字符号(##)作为其名称的第一个字符;它们在创建后对任何用户可见,并且当引用该表的所有用户与SQL Server实例断开连接时,它们将被删除。

例如,如果创建表employees,则表中的任何具有数据库安全权限的人都可以使用该表,直到删除该表为止。如果数据库会话创建本地临时表#employees,则只有会话可以使用该表,并且会话断开连接时将删除该会话。如果创建全局临时表## employees,则数据库中的任何用户都可以使用此表。如果在创建表后没有其他用户使用此表,则断开连接时将删除该表。如果其他用户在创建表后使用该表,则SQL Server会在您断开连接后以及在所有其他会话不再主动使用它之后将其删除。

另外,来自Curt的人纠正了我的方式错误,以防万一你错过了评论中的引文:

http://msdn.microsoft.com/en-us/library/ms191132.aspx

  • 如果您创建本地临时 在存储过程中的表, 临时表仅存在于 存储过程的目的;它 退出存储时消失 过程

  • 如果执行存储过程 调用另一个存储过程, 被调用的存储过程可以 访问由。创建的所有对象 第一个存储过程,包括 临时表。

答案 4 :(得分:1)

要在用户之间共享临时表,请在名称## like_this之前使用两个哈希值。

在这种情况下,尽管请确保采取措施避免与程序的多个实例发生冲突。

答案 5 :(得分:0)

创建临时表时会出现名称错误,因此不同存储过程调用之间不应存在冲突。

如果您需要在后续存储过程调用中操作相同的临时数据,最好只使用真实表并使用某种唯一标识符来确保您只处理相关数据。如果数据只是暂时有价值,请在完成后手动将其删除。