【问题标题】:"Level" scope in local temporary tables sql server本地临时表 sql server 中的“级别”范围
【发布时间】:2015-05-08 09:51:33
【问题描述】:

我在读一本书,提到

本地临时表在创建它们的整个级别、批次之间以及调用堆栈的所有内部级别中都是可见的。所以如果你在代码中的特定级别创建临时表,然后执行动态批处理或存储过程,内部批处理可以访问临时表。

即使在同一级别的批次中,表变量也不可见

从其他来源,我了解到本地临时表对创建它的会话可见,并在会话关闭时销毁。

那么这里的“级别”和“调用堆栈的内部级别”是什么意思?

【问题讨论】:

    标签: sql-server scope temp-tables


    【解决方案1】:

    想象一个名为A 的存储过程,然后依次调用两个存储过程BC1

    这些存储过程中的每一个都会创建一个同名的临时表,前缀(当然)以#(因此,A 创建#A)作为它们的第一个操作,然后再运行任何其他代码。

    您在查询分析器中执行以下代码:

    CREATE TABLE #F (ID INT NOT NULL)
    EXEC A
    GO
    EXEC A
    

    A 中的代码可以与表 #F#A 一起使用。

    B 中的代码可以与表 #F#A#B 一起使用

    C 中的代码可以与表 #F#A#C 一起使用

    尽管BC 处于同一“级别”(它们都是从A 调用的),但C 无法访问B 创建的临时表(@ 时为destroyed 987654345@退出)。


    1

    CREATE PROCEDURE A
    AS
        CREATE TABLE #A (ID INT NOT NULL)
        EXEC B
        EXEC C
    

    【讨论】:

    • 表变量怎么样? A 中声明的表变量 @tabA(在您的 CREATE TABLE #A 之后)对 B 和 C 可见吗?
    • 据我了解,变量不跨批次。我记得在某处读到 EXEC 本身就是一个孤立的事务。诸如 EXEC B 之类的调用会是隐含的批处理和/或事务吗?
    • @Kenny - 表变量仅在创建它们的同一范围内可见。范围、批次和事务实际上是三个独立的概念。但是,如果您想充实这些细节,那么这里的 cmets 将不适合。 EXEC 创建一个新的范围Batches 是客户端发送的语句集(SSMS 等工具通过允许您编写由GOs 分隔的多个批处理来隐藏这些行,然后该工具在发送到服务器之前将其拆分) .交易与这两者都是正交的。
    • @Kenny - 我能想到的剩下的一个细节是,每个批次都隐含地提交给服务器,在逻辑上,作为EXEC - 这就是表变量在整个过程中不可见的原因批次 - 因为它们在不同的范围内。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多