在嵌套存储过程中创建重复的临时表

Dap*_*e B 7 sql-server stored-procedures

情况如下:

过程1创建临时表(#MYTABLE)并调用过程2.过程2还尝试创建具有不同列的#MYTABLE.当过程2尝试将数据插入#MYTABLE时,会发生错误,抱怨"列名无效".我有两个问题:

1)在程序2中创建#MYTABLE时,系统是否应该抱怨?我理解为什么它不能在编译时反对,但在运行时我会发现错误.

2)鉴于它没有抱怨创建,事实上当您从过程2中的#MYTABLE中进行SELECT时,您会看到新列,为什么它会抱怨INSERT?

下面是代码.取消注释INSERT语句将得到错误.

(我知道很多方法可以解决这个问题,因此我不需要对此做出回应.我只是想了解发生了什么.)

IF OBJECT_ID(N'dbo.MYPROC1', N'P') IS NOT NULL
    DROP PROCEDURE dbo.MYPROC1;
GO

CREATE PROCEDURE dbo.MYPROC1
AS
    CREATE TABLE dbo.#MYTABLE ( Name VARCHAR(256) );

    SELECT
        'DO NOTHING 1' AS TABLENAME;

    EXEC dbo.MYPROC2;

GO

IF OBJECT_ID(N'dbo.MYPROC2', N'P') IS NOT NULL
    DROP PROCEDURE dbo.MYPROC2;
GO

CREATE PROCEDURE dbo.MYPROC2
AS
    SELECT
        'INSIDE PROC 2 BEFOREHAND' AS TABLENAME
       ,*
    FROM
        dbo.#MYTABLE;

    CREATE TABLE dbo.#MYTABLE
        (
         Name VARCHAR(256)
        ,LastName VARCHAR(256)
        );

    --INSERT  INTO dbo.#MYTABLE
    --        ( Name, LastName )
    --        SELECT
    --            'BARACK'
    --           ,'OBAMA';

    SELECT
        'INSIDE PROC 2 AFTERWARDS' AS TABLENAME
       ,*
    FROM
        dbo.#MYTABLE;

    --INSERT  INTO dbo.#MYTABLE
    --        ( Name, LastName )
    --        SELECT
    --            'BARACK'
    --           ,'OBAMA';

    SELECT
        'DO NOTHING 2' AS TABLENAME;

GO

EXEC MYPROC1;
Run Code Online (Sandbox Code Playgroud)

Joe*_*lli 6

从“ 创建表”文档中:

在存储过程或触发器中创建的本地临时表可以与调用存储过程或触发器之前创建的临时表具有相同的名称。但是,如果查询引用一个临时表,并且此时存在两个具有相同名称的临时表,则不会定义查询要针对哪个表进行解析。嵌套存储过程还可以创建与由调用它的存储过程创建的临时表同名的临时表。但是,为了进行修改以解析在嵌套过程中创建的表,该表必须具有与在调用过程中创建的表相同的结构,并具有相同的列名。