簡體   English   中英

SQL Server 2005和臨時表范圍

[英]SQL Server 2005 and temporary table scope

我已經閱讀了臨時表和范圍的主題,我所看到的所有答案似乎都沒有談到我的一個問題。

我知道本地臨時表的范圍僅對存儲過程或子存儲過程的生命周期有效。 然而,關於確定性的情況如何。 即如果我有一個存儲過程創建一個臨時表,該臨時表是從兩個不同的進程調用但來自相同的用戶/連接字符串,那么臨時表是否會在對該一個存儲過程的兩次調用之間共享,或者是每次調用存儲過程都會創建一個唯一的臨時表實例。

我假設臨時表屬於對存儲過程的調用范圍,但我想確定在我走這條路徑之前。

本地臨時表(以#開頭)僅限於您的會話; 其他會話,即使是來自同一用戶/連接字符串,也看不到它們。 生命周期的規則取決於是否在存儲過程中創建了本地臨時表:

  • 當過程結束時,將刪除在存儲過程中創建的本地臨時表; 其他存儲過程或調用進程無法看到它們。
  • 會話結束時,將刪除其他本地臨時表。

全局臨時表(以##開頭)在會話之間共享。 他們在下列時被刪除:

  • 創建它們的會話結束
  • 沒有其他會話指的是他們

此命令可以方便地查看存在哪些臨時表:

select TABLE_NAME from tempdb.information_schema.tables 

如果您不確定它們是否存在,這對於刪除臨時表非常方便:

if object_id('tempdb..#SoTest') is not null drop table #SoTest

有關更多信息,請參閱此MSDN文章

臨時表將可訪問創建它的過程的實例

以下腳本

Exec ('Select 1 as col Into #Temp Select * From #Temp')
Exec ('Select 2 as col Into #Temp Select * From #Temp')

返回

Col
1

Col
2

Col
1
2

或者因為表已經存在而出錯。

臨時表也可以由初始過程運行的任何“子”程序訪問。

下面的文章可能有所幫助:“如何在存儲過程之間共享數據” http://www.sommarskog.se/share_data.html

您可能還會考慮使用表變量。 它們具有非常明確的范圍,並且它們有時比它們的臨時表格更快。 表變量的唯一問題是它們不能被索引,因此盡管性質可能會丟失一些性能。 點擊此處查看有關此主題的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM