2010-05-12 83 views
1

我最近一直在研究SQL並探索了一下。在關於臨時表我已經發現了3種不同的臨時表類型:SQL Server中派生表的範圍

1)CREATE TABLE #TempTable

2)宣佈該表@TempTable

3)SELECT * FROM(SELECT * FROM客戶)AS TempTable

現在我明白了#TempTable和@TempTable類型背後的範圍,但是如何在示例3中派生表?這個派生表在哪裏存儲?並且如果它在1個事務中聲明,第2個事務可以訪問它,還是與例1和2相同的派生表的範圍?

+0

你錯過了一些,看到我的回答 – 2010-05-12 12:31:35

+0

如果你更喜歡我的答案,你可以更改你接受的答案。 – 2010-05-13 11:34:49

+0

雖然你增加了額外的東西,但是我的第一個問題是由Mark :) – StevenMcD 2010-05-13 14:15:16

回答

1

這取決於你使用的是實際的RDBMS - 我將承擔的Sybase或SQL Server(但對於所有的可能是真的)

SELECT * FROM (SELECT * FROM Customers) AS TempTable 

不是Temptable僅適用於當前的SQL語句,即只是選擇。

SELECT * FROM Customers into tempdb..TempTable 

將創建在tempdb的新表whichg將必須顯式刪除

+0

回答的,這樣就和第一個例子中的範例一樣,謝謝! – StevenMcD 2010-05-12 10:54:00

+1

否 - #tempTable持續會話/連接 - 選擇爲只是一個選擇,並選擇是全局的 – Mark 2010-05-12 11:15:07

6

1)CREATE TABLE #TempTable --local臨時表

本地臨時表只在可見當前會話,並且可以在嵌套的存儲過程調用之間共享:http://www.sommarskog.se/share_data.html#temptables

2)DECLARE TABLE @TempTable - 本地表變量e

局部變量的作用域是聲明它的批處理,存儲過程或語句塊。它們可以作爲過程之間的參數傳遞。它們不受交易限制,並且會在回滾之後保留所有行。

3)SELECT * FROM(SELECT * FROM客戶)AS不是Temptable --derived表

是與當前查詢僅

4)CREATE TABLE ##不是Temptable --global臨時可見表

這與#temp表不同之處在於它對所有進程都可見。當創建過程結束時,該表將被刪除(但會等到來自其他過程的當前活動完成)。

5)CTE - 公用表表達式

例如CTE:

;WITH YourBigCTE AS 
(
    big query here 

) 
SELECT * FROM YourTable1 WHERE ID IN (SELECT ID FROM YourBigCTE) 
UNION 
SELECT * FROM YourTable2 WHERE ID IN (SELECT ID FROM YourBigCTE) 

可以使用相同的CTE命令內多次,甚至遞歸,和將持續的CTE的持續時間命令。

+0

哇,不知道全球臨時表!謝謝! – StevenMcD 2010-05-12 19:41:58