SQL中的临时表错误

时间:2014-03-25 16:36:34

标签: sql sql-server

我有两个存储过程:SP1和SP2。它们都包含临时表#Temp,但两个存储过程之间的表结构不同。

还有第三个存储过程,SP3从SP1和SP2调用,它更新了#Temp中的列。

SP3是这样的:

if @CallingSP = SP1 
begin update #Temp
      set ColumnA= 'abc'
end

if @CallingSP = SP2 
begin update #Temp
      set ColumnB= 'xyz'
end     

现在,列“ColumnA”仅存在于SP1中,“ColumnB”仅存在于SP2中。因此,当我从SP1执行SP3时,我收到“ColumnB”的无效列错误。

我目前正在做的是创建另一组存储过程并在SP3中执行它们,如下所示:

if @CallingSP = SP1 
begin exec SP4
end

if @CallingSP = SP2 
begin exec SP5
end 

还有另外一种解决方法,不需要我创建SP4和SP5吗?

1 个答案:

答案 0 :(得分:0)

如果必须在父子proc之间共享表,则需要将调用过程中的#temp表重命名为唯一名称。以下是复制问题的Test1, Test2, Test3程序的代码。在SP Test3而不是更新相同的#temp表格中,我在第一种情况下将其更改为udpate #temp1,在第二种情况下将其更改为#temp2

ALTER PROC Test1
AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @SP_Name SYSNAME = OBJECT_NAME(@@PROCID)
        IF OBJECT_ID('tempdb.dbo.#temp1') IS NOT NULL DROP TABLE #temp1
        CREATE TABLE #temp1 ( ColumnA VARCHAR(1) )
        INSERT INTO #temp1 VALUES ( 'C' );
        EXEC dbo.Test3 @pProcCalled = @SP_Name;
        SELECT * FROM #TEMP1
        IF OBJECT_ID('tempdb.dbo.#temp1') IS NOT NULL DROP TABLE #temp1
    END

GO
ALTER PROC Test2
AS
    BEGIN
        SET NOCOUNT ON;
        IF OBJECT_ID('tempdb.dbo.#temp2') IS NOT NULL DROP TABLE #temp2
        DECLARE @SP_Name SYSNAME = OBJECT_NAME(@@PROCID)
        CREATE TABLE #temp2 ( ColumnB VARCHAR(1) )
        INSERT INTO #temp2 VALUES ( 'C' ); 
        EXEC dbo.Test3 @pProcCalled = @SP_Name;
        SELECT * FROM #TEMP2
        IF OBJECT_ID('tempdb.dbo.#temp2') IS NOT NULL DROP TABLE #temp2
    END

GO

ALTER PROC Test3 ( @pProcCalled SYSNAME )
AS
    BEGIN
        SET NOCOUNT ON;
            IF @pProcCalled = 'Test1'
                    UPDATE #temp1 SET ColumnA = 'A'

            IF @pProcCalled = 'Test2'
                    UPDATE #temp2 SET ColumnB = 'B'
    END

另一种选择是使用OUTPUT参数。