有没有办法在SQL Server上使用JDBC创建一个全局临时表,这个表在我的连接关闭后会一直存在?
我发现如果使用JTDS JDBC驱动程序创建全局临时表,则在连接关闭后它不存在:
String sql = "CREATE TABLE ##foobar([name] [nvarchar](50) NOT NULL)";
Statement stmt = connection.getConnection().createStatement();
stmt.execute(sql);
我想要的是一个对所有人都可见的表,并且会在服务器重新启动之前保持连接状态。
答案 0 :(得分:0)
您可以使用永久表,视图和登录触发器为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(因此稍后进行清理,如果有的话)。但从客户的角度来看,它可能“足够接近”。
答案 1 :(得分:0)
本地临时表在与SQL Server实例相同的连接期间仅对其创建者可见,就像首次创建或引用表时一样。用户断开与SQL Server实例的连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都可见,并且在引用它们的所有连接都已关闭时被删除(请参阅MSDN docs)
在这种情况下,我需要的是每个人都可以看到的Tempdb永久表,并在服务器重新启动时被删除:
CREATE TABLE tempdb..foobar([name] [nvarchar](50) NOT NULL)