存储过程的临时表行为

时间:2016-09-07 03:33:54

标签: sql-server tsql

SQL Server 2008

我在存储过程中创建一个本地临时表,然后调用另一个存储过程,通过向其添加列来更改临时表。 SELECT *在调用和调用存储过程中的行为与预期/期望相同:返回已修改的表列。

但是,如果我尝试SELECT [added column],我会收到错误'无效列'。

CREATE PROCEDURE ProcA
AS
BEGIN
    CREATE TABLE #BigTemp 
    (
        BigTempId INT IDENTITY (1,1) NOT NULL
    );

    execute ProcB;

    SELECT * FROM #BigTemp;
END

CREATE PROCEDURE ProcB
AS
BEGIN
    ALTER TABLE #BigTemp
    ADD ProductId int NULL;

    SELECT * FROM #BigTemp;
END

执行ProcA返回

BigTempId     ProductId
-----------------------

BigTempId     ProductId
-----------------------

现在,如果我修改了ProcB:

ALTER PROCEDURE ProcB
AS
BEGIN
    ADD ProductId int NULL;
    SELECT ProductId FROM #BigTemp;
END

我获得了奖励:

  

无效的列名'ProductId'

现在,在我的实际对象中,我正在动态创建ALTER / ADD语句并使用sp_executesql执行它,但行为是相同的。这肯定对我没有任何意义。想法?

2 个答案:

答案 0 :(得分:0)

我仍然没有得到Temp表的这种行为。

但是在代码之下可以克服它。

    ALTER PROCEDURE PROCA
    AS
    BEGIN
        CREATE TABLE #BIGTEMP 
        (
            BIGTEMPID INT IDENTITY (1,1) NOT NULL
        );
        EXECUTE PROCB;

         SELECT PRODUCTID  FROM #BIGTEMP B
    END

    ALTER PROCEDURE PROCB
    AS
    BEGIN
        ALTER TABLE #BIGTEMP
          ADD PRODUCTID INT NULL;

         SELECT * INTO #TEMP FROM #BIGTEMP

         SELECT PRODUCTID FROM #TEMP

    END

答案 1 :(得分:0)

问题是由于预编译。添加WITH RECOMPILE或exec with recomile