SiteName, SiteId 및 UnitCount에 대해 세 개의 열을 반환하는 저장된 proc spGetSites가 있습니다. 저장된 proc은 완벽하게 잘 실행됩니다. 아래 구문으로 보고서에 사용할 임시 테이블 @Site에 저장된 proc의 결과를 저장하려고합니다. 이번에는 “INSERT EXEC 문을 중첩 할 수 없습니다.”라는 오류 메시지가 나타납니다.

INSERT와 EXEC 문을 동시에 사용할 수 없습니까?

DECLARE @Site TABLE (SiteName VARCHAR(100), SiteId INT, UnitCount INT) INSERT INTO @Site EXEC spGetSites @SiteId = 0 

댓글

  • , dbfiddle.uk/ … 질문에 저장 프로 시저를 추가하고 SQL Server 버전에 태그를 지정하세요.

답변

spGetSites의 코드를 보면 해당 절차의 어딘가에 다른 INSERT...EXEC가 있습니다. 해당 절차에 직접 포함되거나 호출되는 다른 절차의 장에 중첩 될 수 있습니다.

궁극적으로, 저장 프로 시저가 INSERT...EXEC를 사용하는 경우 다른 INSERT...EXEC 컨텍스트에서 해당 저장 프로 시저를 호출하려고하면 다음과 같은 오류가 발생합니다. 봄 .

어떻게 수정합니까?

  1. 내부 INSERT...EXEC를 가져 와서 여기에 코드를 삽입하면됩니다. 단일 저장 프로 시저. 하지만 다른 절차가 이유가있을 수 있다고 생각합니다. 즉, 코드를 건조하게 유지하기위한 것입니다.

  2. 이것은 Get procedure, 바라건대 호출 스택 어디에서나 데이터 조작이 일어나지 않습니다. 하위 프로 시저를 테이블 반환 함수로 변환 할 수 있습니다. 이렇게하면 내부 INSERT...EXEC를 변환 할 수 있습니다. INSERT...SELECT로 변환하고이 문제를 해결합니다.

  3. 외부 프로 시저로 범위가 지정된 임시 테이블을 사용하여 프로 시저간에 데이터를 전달합니다. 복잡하기 때문에 내가 가장 좋아하는 패턴이 아니며, “더 나은 옵션이있는 경우 일반적으로이 패턴을 권장하지 않습니다. 그러나 완전성을 위해 여기에 포함하겠습니다. 기본적으로 spGetSites 외부에서 #temp 테이블을 생성하면 spGetSites 내부에서 생성하지 않고 내부에서 사용할 수 있으며 테이블 삽입 된 데이터는 프로 시저 실행을 유지하고 계속 작동합니다.

모든 사람이 선상에 있고 코딩에 익숙하지 않는 한, “앞으로 누군가가 엉망으로 만들 수있을만큼 복잡한 코딩 패턴이기 때문에 옵션 3을 좋아하지 않습니다. 패턴 : * spGetSites는 먼저 테이블을 생성하지 않으면 실패합니다. 모든 호출자는 먼저 똑같은 테이블을 만들어야한다는 것을 기억해야합니다. * spGetSites는 테이블이 비어 있다고 가정 할 수 없습니다. 외부 호출 (또는 동일한 호출자의 이전 실행)의 기존 데이터가있을 수 있습니다. * 문제 해결 및 디버깅 (그리고 쿼리 계획)에 대한 spGetSites는 테이블 생성 혼란으로 인해 더 복잡합니다.

어떻게해야합니까?

얼마나 복잡한 지 모를 때 코드는 spGetSites 뒤에 있습니다. 내부 INSERT...EXECINSERT...SELECT 또는 모든 spGetSites를 단순화 / 재 작성하여 INSERT...EXEC

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다