그가 제공 한 링크를 포함하여 remus의 멋진 답변 외에도
저장 프로 시저간에 데이터를 공유하는 방법
스토어드 프로 시저 결과를 테이블에 저장할 때 다음 오류 메시지가 표시되는 상황이 있습니다.
INSERT EXEC 문은 중첩 될 수 없습니다.
현재 트랜잭션을 커밋 할 수 없으며 로그 파일에 쓰는 작업을 지원할 수 없습니다. 거래 롤백
그리고 이것이 내가 사용하기 위해 개발 한 자체 저장 프로 시저에서 발생할 때
예를 들어 login
서버에 속한 모든 AD 그룹과 서버의 모든 데이터베이스에 대한 모든 권한 을 알려주는 도구
프로 시저 외부에서 임시 테이블을 작성하고 해당 이름을 매개 변수로 전달합니다.
--===============
-- this way below it works, by passing a temp table as a parameter
--===============
if OBJECT_ID('tempdb.dbo.#my_table') IS NOT NULL
DROP TABLE #my_table
CREATE TABLE #my_table(
db nvarchar(128) COLLATE Latin1_General_CI_AS NULL,
permission_type nvarchar(128) COLLATE Latin1_General_CI_AS NULL,
login_ nvarchar(128) COLLATE Latin1_General_CI_AS NULL,
role_ nvarchar(128) COLLATE Latin1_General_CI_AS NULL,
Obj nvarchar(517) COLLATE Latin1_General_CI_AS NULL,
Permission nvarchar(128) COLLATE Latin1_General_CI_AS NULL,
script nvarchar(1008) COLLATE Latin1_General_CI_AS NULL
)
exec sp_GetLoginDBPermissionsX
@Login='my_loginname',
@debug=0,
@where_to_save ='#my_table'
select *
from #my_table
그리고 절차 내에서 모든 계산 후에 최종 데이터를 반환 할 때 (예 아래) 테이블로 출력하는지 또는 화면으로 다시 돌아가서 스크립트를 동적으로 생성하는지 확인합니다.
select @sql = case when @where_to_save IS not null then
'
insert into ' + @where_to_save + '(db,Permission_Type,login_,role_,obj,Permission,script) '
else '' end +
'
SELECT
J.db,
J.Permission_Type,
J.login_,
J.role_,
J.Obj,
J.Permission,
J.script
FROM #tablewithpermissions J
WHERE J.login_ IN ( SELECT L1.LOGIN_FROM COLLATE Latin1_General_CI_AS FROM #logins L1)
OR J.role_ IN ( SELECT L1.LOGIN_FROM COLLATE Latin1_General_CI_AS FROM #logins L1)
ORDER BY J.DB, J.[permission_order]
'
--print(@sql)
EXEC(@SQL)
그런 다음 화면에 필요한 정보가 있거나 임시 테이블을 매개 변수로 전달하면 데이터가 나타납니다.
이것은 내가 찾은 하나의 솔루션이지만 내 작품에만 사용합니다. DBA
그렇지 않으면 Sql Injection의 위험이 높은 것으로 간주됩니다 .