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
执行它,但行为是相同的。这肯定对我没有任何意义。想法?
答案 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