我有两个存储过程: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吗?
答案 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
参数。