2012-09-26 72 views
3

有什麼辦法可以在SQL Server上使用JDBC來創建全局臨時表,這將在連接關閉後保留下來?通過JDBC創建的SQL Server全局臨時表不會持久

我發現,如果我創建使用JTDS JDBC驅動程序全局臨時表,它沒有我的連接關閉之後存在:

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

我要的是一個表,可見大家的,將持續到連接直到服務器重新啓動。

+2

Um。這就是全局臨時表的*定義*,它在創建它的連接關閉時消失,並且沒有其他連接引用它。也許你需要的是一張普通的舊永久桌子? –

+0

@Damien_The_Unbeliever:也許他認爲全球臨時表的工作方式與Oracle相同... –

+0

在Oracle的會話結束時,他們是否也不會被刪除? http://www.oracle-base.com/articles/8i/temporary-tables.php –

回答

0

本地臨時表只有在與SQL Server實例的相同連接期間纔會與其創建者一樣可見,這與表首次創建或引用時相同。在用戶從SQL Server實例斷開連接後刪除本地臨時表。全局臨時表對於任何用戶和創建後的任何連接都是可見的,並且在所有引用它們的連接都關閉時刪除(請參閱MSDN docs

在這種情況下,我需要的是Tempdb永久表對所有人都是可見的,並且在服務器重新啓動時被刪除:

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

這不是一個答案,它是原始問題的延續。 – CodeChimp

+0

我想要一個對每個人都可見的表格,並且將持續到連接直到服務器重新啓動 - 此答案描述瞭如何通過在tempdb中創建表來實現這一點。 – tukushan

0

可以創造一些具有類似行爲給甲骨文的風格臨時表,使用永久表,視圖,以及登錄觸發器:

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(因此稍後進行清理,如果有的話)。但從客戶角度來看,它可能「足夠接近」。