通过 JDBC 创建的 SQL Server 全局临时表不会持久保存



有没有办法在SQL Server上使用JDBC创建一个全局临时表,该表将在连接关闭后保留?

我发现如果我使用 JTDS JDBC 驱动程序创建一个全局临时表,在我的连接关闭后它就不存在了:

String sql = "CREATE TABLE ##foobar([name] [nvarchar](50) NOT NULL)";
Statement stmt = connection.getConnection().createStatement();
stmt.execute(sql);

我想要的是一个对每个人都可见的表,它将跨连接持续存在,直到服务器重新启动。

您可以使用永久表、视图和登录触发器创建与 Oracle 样式临时表具有类似行为的内容:

create table dbo._Data (
    Session int not null constraint DF__Data DEFAULT (@@SPID),
    ColumnA int not null,
    ColumnB int not null
)
go
create view dbo.Data (
    ColumnA,
    ColumnB
)
with schemabinding
as
    select
        ColumnA,
        ColumnB
    from
        dbo._Data
    where
        Session = @@SPID
with check option
go
create trigger T_Data_Logon_Cleardown
ON ALL SERVER
FOR LOGON
AS
    delete from Database.dbo.Data
go

然后,对dbo.Data"表"执行所有操作。

这具有每个会话的行都是隔离的特征,如果断开连接并重新连接,"表"将为空。

不会得到的是自动清除事务边界上的行(如果这是您的首选选项 - 您必须手动删除)。它也不完全相似,因为行将保留在表中,直到新会话声明旧会话 ID(因此清理稍后进行,如果有的话)。但从客户的角度来看,它可能"足够接近"。

本地临时表仅在与 SQL Server 实例的相同连接期间对其创建者可见,就像首次创建或引用表时一样。用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接可见,并在所有引用它们的连接关闭时删除(请参阅 MSDN 文档)

在这种情况下,我需要的是一个对每个人都可见的 Tempdb 永久表,并在重新启动服务器时删除:

CREATE TABLE tempdb..foobar([name] [nvarchar](50) NOT NULL)

最新更新