如何从创建它的事务外部检查全局临时表

Lau*_*nce 6 sql-server transaction tempdb temporary-tables

为了帮助调试一批 SQL(在事务中运行),在事务中我将一些数据转储到全局临时表中。全局临时表是在事务内部创建的(由于我不打算在这里讨论的原因,我别无选择)。

我想我可以通过使用“with(nolock)”从事务外部(即在不同的连接下)从临时表中进行选择。但是,选择被阻止完成。

有没有办法从事务外部的临时表中进行选择?

Dav*_*oft 18

将此提交到“仅仅因为您可以,并不意味着您应该”

如果您在第一个会话中生成一个绑定令牌,并以某种方式发布它,您可以从另一个会话加入它的事务。

例如来自 spid 61:

if @@TRANCOUNT > 0 rollback
go
begin transaction

select *
into ##t
from sys.objects 


declare @bind_token varchar(255);  
exec sp_getbindtoken @bind_token output
declare @bind_token_bin as varbinary(128) = cast(@bind_token as varbinary(128))
set context_info @bind_token_bin

--rollback
Run Code Online (Sandbox Code Playgroud)

然后从另一个会话

declare @bind_token varchar(255) = (
    select cast(context_info as varchar(255))
    from sys.dm_exec_sessions
    where session_id = 61
)

exec sp_bindsession @bind_token
go
select * from ##t
Run Code Online (Sandbox Code Playgroud)


Pau*_*ite 8

不是真的,不是。

已创建但未提交的全局临时表受模式修改锁保护,该锁与其他所有内容都不兼容,包括读取未提交隔离下所需的最小模式稳定性锁。

很难猜测为什么需要这个,但通常的问题都围绕着全局临时表的生命周期。长期存在的解决方案是在标记为在实例启动时运行的过程中创建全局临时表。以这种方式创建的全局临时表永远不会自动删除。

在Azure的SQL数据库(目前公开预览版),并可能在未来盒产品,有GLOBAL_TEMPORARY_TABLE_AUTODROP参数ALTER DATABASE SCOPED CONFIGURATION