2010-05-13 75 views
0

问题1:在SQL Server 2008中,是有可能禁用全局临时表的自动降

我在SQL Server中使用全局临时表2008

但一旦我关闭连接这个临时被丢弃

有没有什么办法来禁用自动降

问题2:

如果两个连接都accesstion相同的全局临时表和NOTher连接是 试图删除该全局临时表,SQL Server是否正确处理这个同步 ?

从 nayeem汗

回答

2

如果你需要一个表来持续超过创建它的连接的死亡,你应该建立一个普通表,而不是暂时的。它仍然可以直接在tempdb中创建(在服务器重新启动时为您创建简单日志记录和自动销毁的好处),但它的名称不会以##为前缀。

DROP TABLE是一个事务性语句,它将阻止使用该表的任何活动连接(带锁)。

0

当创建## GlobalTempTable的连接结束时,该表将被删除,除非存在锁定。

你可以从其他进程运行像这样保持表被丢弃:

BEGIN TRANSACTION 
    SELECT TOP 1 FROM ##GlobalTempTable WITH (UPDLOCK, HOLDLOCK) 


...COMMIT/ROLLBACK 

然而,当交易结束后,该表将被丢弃。如果你不能使用这样的交易,那么你应该使用一个使用Process-Keyed Table method的永久表。

+0

除了保持表格活着外,这不会阻止任何其他连接读取(更不用说更新),无论哪个随机记录被TOP 1选中。锁定甚至可能会从一行升级到一个页面,范围甚至表锁可以防止更多的数据被访问。这可能并不理想!我不确定,但如果表格中没有任何数据,则不会执行锁定。 – 2010-05-13 14:46:40

+0

这完全取决于## globaltemp表的实现。可能每个进程都有自己的行块? OP从不解释。我敢打赌,真正的解决方案是使用比## globaltemp表格更类似于我在我的回答中链接到的[Process-Keyed Table method](http://www.sommarskog.se/share_data.html#prockeyed) 。 – 2010-05-13 14:58:11

2

您可以在存储过程中创建全局临时表并将其标记为启动选项。

对于在启动过程中创建的所有全局临时表,SQL Server维护的引用计数大于零。

一些示例代码

CREATE PROC dbo.CreateGlobalTempTables 
AS 
CREATE TABLE ##my_temp_table 
(
    fld1 INT NOT NULL PRIMARY KEY, 
    fld2 INT NULL 
); 
GO 

EXEC dbo.sp_procoption 'dbo.CreateGlobalTempTables', 'startup', 'true'; 

全局临时表将在启动时自动创建和坚持,直到有人明确地丢弃。