问题1:在SQL Server 2008中,是有可能禁用全局临时表的自动降
我在SQL Server中使用全局临时表2008
但一旦我关闭连接这个临时被丢弃
有没有什么办法来禁用自动降
问题2:
如果两个连接都accesstion相同的全局临时表和NOTher连接是 试图删除该全局临时表,SQL Server是否正确处理这个同步 ?
从 nayeem汗
问题1:在SQL Server 2008中,是有可能禁用全局临时表的自动降
我在SQL Server中使用全局临时表2008
但一旦我关闭连接这个临时被丢弃
有没有什么办法来禁用自动降
问题2:
如果两个连接都accesstion相同的全局临时表和NOTher连接是 试图删除该全局临时表,SQL Server是否正确处理这个同步 ?
从 nayeem汗
如果你需要一个表来持续超过创建它的连接的死亡,你应该建立一个普通表,而不是暂时的。它仍然可以直接在tempdb中创建(在服务器重新启动时为您创建简单日志记录和自动销毁的好处),但它的名称不会以##为前缀。
DROP TABLE是一个事务性语句,它将阻止使用该表的任何活动连接(带锁)。
当创建## GlobalTempTable的连接结束时,该表将被删除,除非存在锁定。
你可以从其他进程运行像这样保持表被丢弃:
BEGIN TRANSACTION
SELECT TOP 1 FROM ##GlobalTempTable WITH (UPDLOCK, HOLDLOCK)
...COMMIT/ROLLBACK
然而,当交易结束后,该表将被丢弃。如果你不能使用这样的交易,那么你应该使用一个使用Process-Keyed Table method的永久表。
您可以在存储过程中创建全局临时表并将其标记为启动选项。
对于在启动过程中创建的所有全局临时表,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';
全局临时表将在启动时自动创建和坚持,直到有人明确地丢弃。
除了保持表格活着外,这不会阻止任何其他连接读取(更不用说更新),无论哪个随机记录被TOP 1选中。锁定甚至可能会从一行升级到一个页面,范围甚至表锁可以防止更多的数据被访问。这可能并不理想!我不确定,但如果表格中没有任何数据,则不会执行锁定。 – 2010-05-13 14:46:40
这完全取决于## globaltemp表的实现。可能每个进程都有自己的行块? OP从不解释。我敢打赌,真正的解决方案是使用比## globaltemp表格更类似于我在我的回答中链接到的[Process-Keyed Table method](http://www.sommarskog.se/share_data.html#prockeyed) 。 – 2010-05-13 14:58:11