Sql server 在SQL Server 2008中,是否可以禁用全局临时表的自动删除

Sql server 在SQL Server 2008中,是否可以禁用全局临时表的自动删除,sql-server,temp-tables,Sql Server,Temp Tables,问题1:我在SQLServer2008中使用全局临时表。但一旦我的连接关闭,这个温度就会下降。有没有办法禁用自动拖放 问题2:如果两个连接正在访问同一个全局临时表,而另一个连接正在访问 尝试删除该全局临时表时,SQL Server是否正确处理了该同步?如果需要一个表在创建该表的连接终止后继续存在,则应只创建一个常规表而不是临时表。它仍然可以直接在tempdb中创建(让您获得简单日志记录和服务器重启时自动销毁的好处),但它的名称不会以##作为前缀 DROP TABLE是一种事务性语句,如果有任何活

问题1:我在SQLServer2008中使用全局临时表。但一旦我的连接关闭,这个温度就会下降。有没有办法禁用自动拖放

问题2:如果两个连接正在访问同一个全局临时表,而另一个连接正在访问
尝试删除该全局临时表时,SQL Server是否正确处理了该同步?

如果需要一个表在创建该表的连接终止后继续存在,则应只创建一个常规表而不是临时表。它仍然可以直接在tempdb中创建(让您获得简单日志记录和服务器重启时自动销毁的好处),但它的名称不会以##作为前缀


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

如果需要一个表在创建该表的连接终止后继续存在,则只需创建一个常规表而不是临时表。它仍然可以直接在tempdb中创建(让您获得简单日志记录和服务器重启时自动销毁的好处),但它的名称不会以##作为前缀


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

当创建###GlobalTempTable的连接结束时,该表将被删除,除非有针对该表的锁

您可以从另一个进程运行类似这样的操作,以防止删除该表:

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


...COMMIT/ROLLBACK

但是,当事务结束时,表将被删除。如果不能使用这样的事务,则应使用永久表。

当创建###GlobalTempTable的连接结束时,该表将被删除,除非有针对它的锁

您可以从另一个进程运行类似这样的操作,以防止删除该表:

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


...COMMIT/ROLLBACK

但是,当事务结束时,表将被删除。如果不能使用这样的事务,则应使用永久表。

您可以在存储过程中创建全局临时表,并使用启动选项对其进行标记

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';

全局临时表将在启动时自动创建并保持,直到有人明确删除它。

您可以在存储过程中创建全局临时表,并使用启动选项对其进行标记

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';

全局临时表将在启动时自动创建,并一直保存到有人明确删除它。

除了保持表的活动状态外,这是否也会阻止任何其他连接读取(更不用说更新)前1名选择的任意记录。锁甚至可能从一行升级到一页、数据块甚至表锁,从而阻止访问更多数据。这可能不可取!我不确定,但如果发出此命令时表中没有数据,则不会保留锁。这将取决于###globaltemp表的实现。可能每个进程都有自己的行块?OP从未解释过。我敢打赌,真正的解决方案是使用###globaltemp表之外的其他内容,比如我在回答中链接到的。除了保持表的活动性之外,这是否也会阻止任何其他连接读取(更不用说更新)前1名选择的任意记录。锁甚至可能从一行升级到一页、数据块甚至表锁,从而阻止访问更多数据。这可能不可取!我不确定,但如果发出此命令时表中没有数据,则不会保留锁。这将取决于###globaltemp表的实现。可能每个进程都有自己的行块?OP从未解释过。我敢打赌,真正的解决办法是使用比###globaltemp表更有用的东西,就像我在回答中链接到的那样。