특정 테이블을 참조하는 모든 저장 프로 시저를 발광하는 방법
테스트 목적으로 개발 환경에 테이블을 만들 예정이 테이블을 추천하는 sp가 거의 없습니다. 이제이 테이블을 삭제 하고이 테이블을 참조하는 모든 sp를 관찰해야합니다. 모든 sp의 목록을 찾기가 어렵습니다. 테이블 이름이 'x'이고 데이터베이스가 SQL Server 2005라고 가정하여 쿼리를 제안하십시오.
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'
BTW- 다음은 바로 유형의 질문에 대한 유용한 리소스입니다 . SQL Server 시스템 카탈로그 쿼리 FAQ
다음은 SQL2008 이상에서 작동합니다. 저장 프로 시저 및 함수 목록을 제공합니다.
select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
from sys.objects o inner join sys.sql_expression_dependencies sd on o.object_id = sd.referenced_id
inner join sys.objects sp on sd.referencing_id = sp.object_id
and sp.type in ('P', 'FN')
where o.name = 'YourTableName'
order by sp.Name
쿼리가 아닌 방법은 Sql Server Management Studio를 사용하는 것입니다.
마우스 오른쪽 단추로 클릭하고 "종속성보기"를 선택하십시오.
편집하다
그러나 언론인이 말했듯이, 말할 만하지 않습니다.
모든 위의 쿼리는 올바른 결과를 제공하지 않고 다음과 같이 테이블을 얻을 데 사용할 수있는 프로 시저가 있습니다.
EXEC sp_depends @objname = N'TableName';
다음 쿼리는 모든 저장 프로 시저 이름과 해당 SP의 해당 정의를 가져옵니다.
select
so.name,
text
from
sysobjects so,
syscomments sc
where
so.id = sc.id
and UPPER(text) like '%<TABLE NAME>%'
SELECT
o.name
FROM
sys.sql_modules sm
INNER JOIN sys.objects o ON
o.object_id = sm.object_id
WHERE
sm.definition LIKE '%<table name>%'
이것은 또한 테이블 이름이 주석에 테이블 이름이 사용중인 다른 테이블의 서브 채널 인 SP를 나타냅니다. 예를 들어 이름이 "test"및 "test_2"인 테이블이 "test"를 사용하여 SP를 검색하려고 둘 다에 대한 결과가 표시됩니다.
아래 쿼리는 열에 대한 진술이 아닌 테이블에 대한 검색을 할 때만 작동합니다.
EXEC sp_depends @objname = N'TableName';
그러나 다음 쿼리는 모든 종류의 종속성을 검색하려는 경우 가장 좋은 옵션이며, 어떤 것도 놓치지 않습니다. 실제로 필요한 것보다 더 많은 정보를 제공합니다.
select distinct
so.name
--, text
from
sysobjects so,
syscomments sc
where
so.id = sc.id
and lower(text) like '%organizationtypeid%'
order by so.name
Management Studio에서 테이블을 마우스 오른쪽 버튼으로 클릭하고 '종속성보기'를 클릭하면됩니다.
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'
GO
테이블 이름을 언급해야하는 경우 작동합니다.
이 시도
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%your table name%'
기본적으로 두 가지 옵션이 있습니다.
----옵션 1
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'
---- 옵션 2
SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'
이 두 쿼리는 원하는 테이블을 참조하는 모든 저장 프로 시저를 가져옵니다. 이 쿼리는 sysobjects 및 syscomments 인 2 개의 sys 테이블에 의존합니다. sysobjects는 저장 프로 시저를 포함하여 모든 DB 개체 이름이 저장되는 곳입니다.
syscomments에는 모든 절차에 대한 텍스트가 포함되어 있습니다.
쿼리하는 경우 : SELECT * FROM syscomments
마지막 열로 저장 프로 시저에 포함 된 텍스트가있는 sysobjects 테이블에 대한 매핑 인 id가 포함 된 테이블이 있습니다.
'IT' 카테고리의 다른 글
배열이 null인지 / 비어 있는지 확인할 수 있습니까? (0) | 2020.07.25 |
---|---|
C # 스위치 명령문에서 변수 선언 (0) | 2020.07.25 |
유닉스의 'ls'이름순 (0) | 2020.07.25 |
C ++-std :: shared_ptr 또는 boost :: shared_ptr에 참조 전달 (0) | 2020.07.25 |
Android : AsyncTask의 onPreExecute ()에 전달 변수를 전달하는 방법은 무엇입니까? (0) | 2020.07.25 |