SQL Server中的全局临时表

时间:2010-10-08 05:43:15

标签: sql sql-server

我有一个##表,可以在所有会话中访问,但有时我会收到错误

  

已经有一个名为的对象   数据库中的'## table'。

为什么以及如何解决它。

3 个答案:

答案 0 :(得分:5)

找到一个有趣的参考here

  

全局临时表的运行方式与本地临时表非常相似;它们是在tempdb中创建的,与永久表相比,锁定和日志记录更少。但是,它们对所有会话都可见,直到创建会话超出范围(并且全局## temp表不再被其他会话引用)。如果两个不同的会话尝试上述代码,如果第一个仍处于活动状态,则第二个会话将收到以下内容:

     
    

服务器:Msg 2714,Level 16,State 6,Line 1     数据库中已经有一个名为“## people”的对象。

  
     

我还没有看到使用全局##临时表的有效理由。如果数据需要持久化到多个用户,那么至少对我来说使用永久表会更有意义。您可以通过在自动启动过程中创建全局##临时表来使其更加永久,但我仍然无法看到它对永久表的优势。使用永久表,您可以拒绝权限;您不能拒绝来自全局## temp表的用户。

答案 1 :(得分:3)

There is already an object named '##table' in the database.

如果您正在执行CREATE Table语句,通常会因为数据库中已存在“## table”而失败,您通常会收到此错误。

在我看来,可能在代码中的某个时刻,再次调用此全局表的CREATE TABLE逻辑会导致此错误。

是否有导致此错误的确切语句的详细信息?

答案 2 :(得分:3)

所以WHY部分已经得到解答,以下是如何解决它:

在创建临时表之前检查是否存在临时表:

    if object_id('tempdb..##table') is null begin
        --create table ##table...
    end

我发现了一篇非常有趣的帖子,关于如何通过Google搜索http://sqlservercodebook.blogspot.com/2008/03/check-if-temporary-table-exists.html

检查临时表的存在