SQL Server中派生表的范围

Ste*_*McD 1 sql sql-server temp-tables scoping

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

1)CREATE TABLE #TempTable

2)DECLARE TABLE @TempTable

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

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

KM.*_*KM. 6

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

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

2)DECLARE TABLE @TempTable --local table变量

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

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)
Run Code Online (Sandbox Code Playgroud)

可以在同一个CTE命令中多次使用,甚至递归,并且将持续CTE命令的持续时间.