2010-11-07 47 views

回答

12

使用臨時表最常見的情況是來自存儲過程。

如果在存儲過程中存在涉及操作無法在單個查詢中完成的數據的邏輯,那麼在這種情況下,可以將一個查詢/中間結果的輸出存儲在臨時表中,該臨時表然後參與通過連接等進一步操作來實現最終結果。

一個在使用臨時表常見的情形是存儲SELECT INTO語句的結果

表變量是相對較新的(在SQL Server 2005中引入的 - 只要我還記得)可以代替使用臨時表中最例。兩者之間的一些分歧進行了討論here

在很多情況下,尤其是在OLTP應用程序,你的程序內的臨時表的使用意味着你MAY可能有業務處理邏輯數據庫和可能是一個考慮因素您可以重新審視您的設計 - 特別是在n層系統的應用程序中具有單獨的業務層的情況下。

9

三者之間的主要區別在於生命和範圍。

通過一張全球表格,我假設你的意思是一個標準的磨機表格。表格用於存儲持久性數據。所有登錄用戶都可以訪問它們。您所做的任何更改對其他用戶都可見,反之亦然。

臨時表僅用於在會話中存儲數據。使用臨時表的最佳時機是當您需要在SQL服務器中存儲信息以用於多個SQL事務時。與普通表一樣,您將創建它並與之交互(插入/更新/刪除),當完成時,您將放棄它。表和臨時表之間有兩點區別。

  1. 臨時表只對您可見。即使其他人創建了一個具有相同名稱的臨時表,其他人也無法看到或影響臨時表。
  2. 只要您登錄,臨時表就存在,除非您明確地刪除它。如果您註銷或斷開連接,SQL Server將自動爲您清理它。這也意味着數據不是持久的。如果您在一個會話中創建臨時表並註銷,則在您重新登錄時它不會存在。

表變量的工作方式與SQL Server中的任何變量一樣。這用於存儲用於單個事務的數據。這是TSQL的一個相對較新的功能,通常用於在過程之間傳遞數據 - 例如傳遞數組。表格和表格變量之間有三點區別。

  1. 像臨時表一樣,它只對您可見。
  2. 因爲它是一個變量,所以它可以在存儲過程之間傳遞。
  3. 臨時表只存在於當前事務中。一旦SQL Server完成一個事務(使用GO或END TRANSACTION語句)或超出範圍,它將被釋放。

我個人避免使用臨時表和表變量,原因有幾個。首先,它們的語法是Microsoft特定的。如果您的程序要與多個RDBMS進行交互,請不要使用它們。此外,臨時表和表變量有增加某些SQL查詢複雜性的傾向。如果你的代碼可以使用更簡單的方法完成,我建議使用簡單的方法。