2010-05-12 97 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