0

저장 프로 시저가 있으므로 저장 프로 시저 'B'라고 해 봅시다. 저장 프로 시저 'B'는 저장 프로 시저 'B'내의 임시 테이블에 삽입해야하는 결과 집합을 반환하는 저장 프로 시저 'A'를 호출하여 추가 변이를 수행합니다. 중첩 삽입 때문에 OPENROWSET을 사용했습니다 (OPENQUERY도 시도했습니다).동적 SQL 문에서 EXEC 프로시 저는 INSERT가 아닌 SELECT 만 수행합니다.

이제는 훌륭하게 작동하는 것 같습니다. 그러나 결과 집합을 반환하는 옆에 저장 프로 시저 'A'는 테이블에 INSERT를 수행합니다. 이상한 일은 저장 프로 시저 'A'가 저장 프로 시저 'B'에서 실행될 때 저장 프로 시저 'A'는 결과 집합 만 반환하고 전혀 삽입하지 않습니다. 그냥 INSERT INTO 전체 문장을 건너 뛰는 것 같습니다. 앞뒤에 삽입 SELECT 'test' 중단 점을 넣으려고했는데 잘 실행됩니다! 이것이 어떻게 가능한지? 이 (내가 약간의 데이터 전송과 열을 변경)처럼

이 쿼리는 같습니다

DECLARE @SQL NVARCHAR(MAX) 

SET @SQL = 'INSERT INTO #Temp (1,2,3) 

SELECT * FROM OPENROWSET (
''SQLOLEDB'', 
''Server=(local);TRUSTED_CONNECTION=yes;'', 
''SET FMTONLY OFF EXECUTE StoredProcedureA 

@Parameter1 = '''''[email protected]+''''' 
,@Parameter_2 = '''''[email protected]+''''' 
'' 
)' 

EXEC(@SQL) 

오류가 반환되지 않습니다. 결과 집합 (SELECT statement from procedure A)은 절차 B에서 #Temp으로 올바르게로드되지만 절차 A에서 수행되는 INSERT은 실행되지 않습니다.

openquery/openrowset은 INSERT를 허용하지 않고 SELECT 출력 만 실행합니까? 보안/권리 문제 일까? 이 문제를 해결할 다른 방법이 있습니까?

미리 감사드립니다.

답변

0

#이 (가) 표시된 임시 테이블을 사용하고 있기 때문입니다. 중첩 저장 프로 시저가 끝나고 임시 테이블이 삭제되면이 테이블의 범위가 끝납니다.

삽입이 발생하면 테이블이 더 이상 존재하지 않습니다.

중첩 된 프로 시저를 시작하기 전에 테이블을 만들면이 문제를 해결할 수 있습니다. 프로 시저 B에서 테이블을 삭제할 수 있습니다.