SQL Server中派生表的范围

时间:2010-05-12 08:38:30

标签: sql sql-server scoping temp-tables

我最近一直在研究SQL并进行一些探索。关于临时表我发现了3种不同的临时表类型:

1)CREATE TABLE #TempTable

2)DECLARE TABLE @TempTable

3)SELECT * FROM(SELECT * FROM Customers)AS TempTable

现在我理解了#TempTable和@TempTable类型背后的范围,但是如例3中的派生表呢?这个派生表存储在哪里?如果它在1个事务中声明,第二个事务是否可以访问它,或者是与示例1和2相同的派生表的范围?

2 个答案:

答案 0 :(得分:6)

1)CREATE TABLE #TempTable - 本地临时表

本地临时表仅在当前会话中可见,并且可以在嵌套存储过程调用之间共享:http://www.sommarskog.se/share_data.html#temptables

2)DECLARE TABLE @TempTable --local table variable

局部变量的范围是声明它的批处理,存储过程或语句块。它们可以作为过程之间的参数传递。它们不受事务处理,并且会在回滚后保留所有行。

3)SELECT * FROM(SELECT * FROM Customers)AS TempTable - 派生表

仅对当前查询可见

4)CREATE TABLE ## TempTable --global temp table

这与#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命令的持续时间。

答案 1 :(得分:1)

这取决于您使用的实际RDBMS - 我将假设Sybase或SQL Server(但可能适用于所有人)

SELECT * FROM (SELECT * FROM Customers) AS TempTable

Temptable仅适用于当前的SQL语句,即只有select。

SELECT * FROM Customers into tempdb..TempTable

会在tempdb中创建一个新表格,必须明确删除