2010-03-24 6 views
3

2 개의 저장 프로 시저 usp_SP1 및 usp_SP2가 있습니다. 둘 다 #tt exec sp_somesp에 insert를 사용합니다. 세 번째 저장 프로 시저를 생성하여 어느 proc를 호출할지 결정합니다. 뭔가 같이 :내포 된 삽입 인스트루먼트 작업을 수행합니다.

create proc usp_Decision 
(
    @value int 
) 
as 
begin 
    if (@value = 1) 
    exec usp_SP1 -- this proc already has insert into #tt exec usp_somestoredproc 
    else 
     exec usp_SP2 -- this proc too has insert into #tt exec usp_somestoredproc 
end 

나중에, 나는 내가 SSRS 데이터 집합 필드를 채울 수 있도록 usp_Decision의 반환 값에 대해 정의 된 몇 가지 구조를 필요 깨달았다. 그래서 여기 내가 뭘하려 : usp_Decision 내

  1. 은 임시 테이블을 생성 할 "#TT 간부 usp_SP1에 삽입"을 시도했다. 이것은 잘 풀리지 않았다. 오류 "삽입 exec는 중첩 될 수 없습니다."

  2. usp_Decision 내에서 저장된 proc에 테이블 변수를 전달하고 저장된 procs 내에서 테이블을 업데이트하고 "select * from"을 수행했습니다. 그것도 잘 작동하지 않았다. 매개 변수로 전달 된 테이블 변수는 저장된 프로 시저 내에서 수정할 수 없습니다.

할 수있는 것을 제안하십시오.

+0

INSERT EXEC의 손상은 SQL Server에 관한 가장 큰 문제 중 하나입니다. 투표하십시오! https://connect.microsoft.com/SQLServer/feedback/details/294571/improve-insert-exec –

답변

0

어떤 경우에도 전역 임시 테이블의 팬이 아니기 때문에 (다른 프로세스가이 테이블을 읽을 수 있고 그 테이블의 데이터를 간섭 할 수 있음).

왜 각 proc에 로컬 임시 테이블을 사용하고 그 테이블에서 *를 마지막 단계로 선택하지 않을까요? 그런 다음 호출하는 proc의 로컬 임시 테이블에 삽입 할 수 있습니다.

esimple 예

create proc usp_mytest1 
as 
select top 1 id into #test1 
from MYDATABASE..MYTABLE (nolock) 

select * from #test1 
go 
--drop table #test 
create proc usp_mytest2 
as 
select top 10 MYTABLE_id into #test2 
from MYDATABASE..MYTABLE (nolock) 

select * from #test2 
go 

create proc usp_mytest3 (@myvalue int) 
as 
create table #test3 (MYTABLE_id int) 
if @myvalue = 1 
Begin 
insert #test3 
exec ap2work..usp_mytest1 
end 
else 
begin 
insert #test3 
exec ap2work..usp_mytest2 
end 

select * from #test3 

go 

exec ap2work..usp_mytest3 1 

exec ap2work..usp_mytest3 0 
+0

각 저장된 proc 내에서 로컬 임시 테이블을 사용하므로 "#tt exec usp_somestored proc"에 삽입하십시오.지금 내가 선택 * 할 #tt_example usp_Decision 저장된 프로 시저를 삽입 할 할 것이다 #tt_example exec usp_SP1 먼저. 그러나 이것은 허용되지 않습니다. 제안 된 접근 방식인지 확실하지 않습니다. 그렇지 않은 경우 의사 코드로 설명하십시오. – stackoverflowuser

+0

# insert exeC# sp_executesql @query 에 내 저장된 procs에 삽입을 사용하고 있으므로 위의 방법이 작동하지 않습니다. – stackoverflowuser

+0

지금은 저장된 procs 둘 모두를 하나로 결합했습니다. 그 거대한 하나지만 지금은 작동합니다. – stackoverflowuser

0

당신은 테이블 반환 사용자 정의 함수를 살펴 있었나요 (중 인라인 또는 다중 문)? HLGEM의 제안과 비슷하게, 이것은 당신이 어디 에나 삽입 할 필요가없는 세트를 리턴 할 것입니다.

1

당신이 usp_SP1 및 usp_SP2을 수정할 수 있습니다 (기본적으로 INSERT의 EXEC 호출이 몇개의 발생에 대한 루프백 연결을 만들 OPENROWSET 사용)?

는 그렇다면, usp_Decision에 결과를 삽입 할 적절한 스키마를 로컬 임시 테이블을 만들 :

create table #results (....) 

그런 다음, 호출 된 프로 시저에서 테스트를이 임시 테이블의 존재. 존재하는 경우, 임시 테이블에 삽입하십시오. 그렇지 않은 경우 결과 세트를 평소대로 리턴하십시오. 중첩 된 프로 시저가 다른 곳에서 호출되면 기존 동작을 유지하는 데 도움이됩니다. 호출 프로 시저로 제어가 반환 될 때 #results가 호출 중 하나 중첩 시저에 의해 채워진 것

if object_id('tempdb..#results') is not null begin 
    insert #results (....) 
    select ..... 
end 
else begin 
    select .... 
end 

.

결과 집합이 동일한 스키마를 공유하지 않으면 usp_Decision에서 두 개의 임시 테이블을 만들어야 할 수 있습니다.

관련 문제