SQLServer : 저장 프로 시저 내에서 참조하는 저장 프로 시저를 추출 할 때 빠졌습니다.

4550 단어 SQLServer

배경



sys.sql_expression_dependencies이라는 테이블을 사용하면 특정 저장 프로 시저에서 참조하는 테이블과 EXECUTE하는 저장 프로 시저를 자동으로 추출 할 수 있습니다.

다음 쿼리를 실행하여 저장 프로 시저 내에서 실행중인 저장 프로 시저를 나열 할 수 있는지 시도해 보았지만 작동하지 않았습니다.
select *
from sys.sql_expression_dependencies as sd
inner join sys.objects as o on o.object_id = sd.referenced_id
    and type = 'P'

데이터를 확인하면 referenced_id가 NULL이므로 본 거동을 조사해 보았습니다.


조사 결과



문서를 보면 referenced_id는

참조할 엔티티의 ID. 스키마 바인드 참조의 경우이 열의 값은 NULL이 아닙니다.

되어 있습니다.
「스키마 바인드」의 의미를 취하지 않겠습니다만, 아마 「스키마 지정까지 하고 있는지 어떤지」라고 생각해, 이하의 실험을 해 보았습니다.
create proc proc111
as
begin
    select 1
end
go

--スキーマバインドなし
create proc proc222
as
begin
    exec proc111
end
go

--スキーマバインドあり
create proc proc333
as
begin
    exec dbo.proc111
end

스키마 바인딩이없는 경우 종속성 추출 결과


select *
from sys.sql_expression_dependencies as sd
where referencing_id = object_id('proc222')



스키마 바인드가있는 경우 종속성 추출 결과


select *
from sys.sql_expression_dependencies as sd
where referencing_id = object_id('proc333')



스키마 바인딩이 있으면 referenced_id를 얻을 수있었습니다.

스키마 바인딩이 없는 저장 프로시저를 참조하는 경우 sys.sql_expression_dependencies를 사용할 때 referenced_id 대신 referenced_entity_name을 사용할 수 있습니다.

sql_dependencies 이면 취득할 수 있는 것 같습니다만, 비추천의 테이블이 되고 있습니다.

좋은 웹페이지 즐겨찾기