2014-03-25 6 views
0

두 개의 저장 프로 시저 SP1 및 SP2가 있습니다. 둘 다 temp 테이블 #Temp를 포함하지만 테이블 구조는 두 개의 저장 프로 시저간에 다릅니다.임시 테이블 오류

SP1과 SP2 모두에서 호출되는 SP3이 있으며 #Temp의 열을 업데이트합니다.

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

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

지금, 열 "COLUMNA는"단지 SP1 및 SP2 만에 "COLUMNB"에 존재 :

SP3이 같은 것입니다. 따라서 SP1에서 SP3을 실행하면 "ColumnB"에 잘못된 열 오류가 발생합니다. 나는 현재이 문제를 얻기 위해 일을하고 저장 프로 시저의 또 다른 세트를 생성하고 다음과 같이 SP3에서 그들을 실행 무엇

:

if @CallingSP = SP1 
begin exec SP4 
end 

if @CallingSP = SP2 
begin exec SP5 
end 

그 주위에 다른 작업 SP4를 만들 저를 필요로하지 않습니다 있나요 및 SP5?

+0

임시 테이블을 사용하지 마십시오. 테이블 변수를 사용하십시오. . . '임시 테이블 선언 (.). –

+0

sp_executesql을 사용하고 실행할 쿼리 문자열을 작성하십시오. – Slava

답변

0

부모 - 자식 프로세스간에 테이블을 공유해야한다면 호출하는 프로 시저에서 #temp 테이블의 이름을 고유 한 이름으로 변경해야합니다. 다음은 Test1, Test2, Test3 절차를위한 코드입니다. 동일한 #temp 테이블을 업데이트하는 대신 SP Test3에서 첫 번째 경우에는 #temp1을, 두 번째 경우에는 #temp2을 udpate로 변경했습니다.

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 매개 변수를 사용하는 것입니다.