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相同的派生表的范围?
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命令的持续时间.
| 归档时间: |
|
| 查看次数: |
3016 次 |
| 最近记录: |