2012-03-28 4 views
0

임시 테이블에 저장하는 결과 집합을 반환하는 SelectSP가 있습니다. 이제 InsertSP라는 다른 SP를 호출하고이 임시 테이블의 값을 매개 변수로 전달하려고합니다. 임시 테이블에서 값을 선택하고 매개 변수로 전달하는 방법 SP

CREATE TABLE #tempTable 
(
    Field1 VARCHAR(255), 
    Field2 VARCHAR(255), 
    Field3 VARCHAR(255), 
    Field4 VARCHAR(255), 
    Field5 VARCHAR(255), 
    Field6 VARCHAR(255), 
    Field7 VARCHAR(255) 
     . 
     . 
     . 

) 

INSERT INTO #tempTable exec 
usp_SelectSP 'p1' ,'p2', 'p3' 

는 이제 하나 이상의 SP를 실행하고 해당 SP에 파라미터로서 필드 1, 필드 2, TEMPTABLE의 입력란 3을 전달할 : 여기

제가

원경있는 코드이다.

나는이

usp_InsertSP 
    @param1 = Field1 
    @Param2 = Field2 
    @Param3 = Field3 

FROM #tempTable. 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까 같은 것을 생각? 그런 다음 가장 쉬운 방법은 아마 될 커서를 호출 SP를 변경할 수없는 경우

+0

: 기사에서 Sharing a Temp Table from the article listed above

을 당신은 하나의 행에 대해 저장 프로 시저를 호출하려고합니까? 아니면 각 행에 대해 한 번씩 프로 시저를 여러 번 호출해야합니까? 호출 된 프로 시저를 'SELECT values ​​FROM # temp'로만 할 수없는 이유는 무엇입니까? 호출 수신자는 호출자가 만든 #temp 테이블을 볼 수 있어야합니다. –

+0

여러 번 호출해야합니다. – Asdfg

+0

InsertSP를 변경할 수 없습니다. 매개 변수를 전달했습니다. – Asdfg

답변

2

:

DECLARE @f1 VARCHAR(255), @f2 VARCHAR(255) --, ... 

DECLARE c CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
    FOR SELECT Field1, Field2 --, ... 
    FROM #tempTable; 

OPEN c; 

FETCH NEXT FROM c INTO @f1, @f2 --, ... 

WHILE @@FETCH_STATUS <> -1 
BEGIN 
    EXEC usp_InsertSP 
    @param1 = @f1, 
    @param2 = @f2 --, ... 

    FETCH NEXT FROM c INTO @f1, @f2 --, ... 
END 

CLOSE c; 
DEALLOCATE c; 

난 강력하게 당신이 호출 된 프로 시저를 변경하는 것이 좋습니다 그러나. 호출 된 프로 시저를 직접 사용하도록 변경할 수 있으면이 #temp 테이블의 데이터를 처리하는 데 훨씬 효율적인 방법이 거의 있습니다.

편집

불리는 시저가 호출자에 의해 만들어진 #temp 테이블을 볼 수있는 입증.

CREATE PROCEDURE dbo.proc1 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CREATE TABLE #t1(a INT); 

    INSERT #t1 SELECT 1 UNION SELECT 2; 

    EXEC dbo.proc2; 

    DROP TABLE #t1; 
END 
GO 

CREATE PROCEDURE dbo.proc2 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT a FROM #t1; 
END 
GO 

EXEC dbo.proc1; 

결과 :

a 
- 
1 
2 
+0

DBA에게 SP 변경을 요청할 수 있습니다. #tempTable이있는 경우 매개 변수의 데이터를 삽입하지 않도록 조건부 삽입을 수행하도록 요청해야합니까? – Asdfg

+0

아니요, 그들이 할 수있는 일은 단순히 'INSERT dbo.table (col1, col2, ...) SELECT field1, field2, ... FROM #tempTable;'입니다 - 호출 된 SP는 #temp 테이블을 볼 수 있기 때문에 ! –

+0

InsertSP가 호출되는 곳과 매개 변수를 전달하는 곳이 있습니다. 그리고 나는 그것이 잘 작동되기를 바랍니다. – Asdfg

1

그냥 #TEMP 표를 공유하세요!

당신은 부모 저장 프로 시저에서 만든 How to Share Data between Stored Procedures by Erland Sommarskog

모든 #temp 테이블을 읽을 필요가 모든 중첩라는 절차가 액세스 할 수있는 참조하십시오 있습니까

The method itself is as simple as this: 

CREATE PROCEDURE called_procedure @par1 int, 
            @par2 bit, 
            ... AS 
    ... 
    INSERT/UPDATE/DELETE #tmp 
go 
CREATE PROCEDURE caller AS 
    DECLARE ... 
    CREATE TABLE #mytemp (col1 int  NOT NULL, 
         col2 char(5) NULL, 
         ...) 
    ... 
    EXEC called_procedure @par1, @par2 ... 
    SELECT * FROM #mytemp 
go 
+0

. 세상에. –

관련 문제