테스트 목적으로 개발 환경에 테이블을 만들었으며이 테이블을 권장하는 sp가 거의 없습니다. 이제이 테이블을 삭제 하고이 테이블을 참조하는 모든 sp를 식별해야합니다. 모든 sp의 목록을 찾기가 어렵습니다. 테이블 이름이 'x'이고 데이터베이스가 SQL Server 2005라고 가정하여 쿼리를 제안하십시오.
테스트 목적으로 개발 환경에 테이블을 만들었으며이 테이블을 권장하는 sp가 거의 없습니다. 이제이 테이블을 삭제 하고이 테이블을 참조하는 모든 sp를 식별해야합니다. 모든 sp의 목록을 찾기가 어렵습니다. 테이블 이름이 'x'이고 데이터베이스가 SQL Server 2005라고 가정하여 쿼리를 제안하십시오.
답변:
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'
BTW-다음은 이러한 유형의 질문에 대한 유용한 리소스입니다 . SQL Server 시스템 카탈로그 쿼리 FAQ
ROUTINE_DEFINITION
에가 INFORMATION_SCHEMA.ROUTINES
?
set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
다음은 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
때때로 위의 쿼리는 올바른 결과를 제공하지 않으며 다음과 같이 테이블 종속성을 얻는 데 사용할 수있는 내장 프로 시저가 있습니다.
EXEC sp_depends @objname = N'TableName';
쿼리가 아닌 방법은 Sql Server Management Studio를 사용하는 것입니다.
테이블을 찾아 마우스 오른쪽 단추로 클릭하고 "종속성보기"를 선택하십시오.
편집하다
그러나 논평자들이 말했듯이, 그것은 신뢰할 만하지 않습니다.
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를 검색하려고하면 둘 다에 대한 결과가 표시됩니다.
syscomments
이러한 방식으로 쿼리 는 정의를 여러 행에 걸쳐 4000 개의 문자 청크로 나누기 때문에 긴 프로 시저에는 신뢰할 수 없습니다. sys.sql_modules
이것을 피하십시오.
sys.sql_modules
대신 사용하도록 업데이트했습니다 .
아래 쿼리는 열에 대한 종속성이 아닌 테이블에 대한 종속성을 검색 할 때만 작동합니다.
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
기본적으로 2 가지 옵션이 있습니다.
----옵션 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를 포함하는 테이블이 있습니다.