【问题标题】:Temp Table Errors in SQLSQL 中的临时表错误
【发布时间】:2014-05-03 16:04:09
【问题描述】:

我有两个存储过程: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 的解决方法吗?

【问题讨论】:

  • 不要使用临时表。使用表变量。 . . declare temp table (. . . ).
  • 使用 sp_executesql 并构建查询字符串来执行

标签: sql sql-server


【解决方案1】:

如果您必须在父子进程之间共享表,则需要在调用过程中将 #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 参数。

【讨论】:

    猜你喜欢
    • 2019-02-22
    • 2018-04-27
    • 1970-01-01
    • 2016-04-25
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多