특정 테이블을 참조하는 모든 저장 프로 시저를 식별하는 방법


136

테스트 목적으로 개발 환경에 테이블을 만들었으며이 테이블을 권장하는 sp가 거의 없습니다. 이제이 테이블을 삭제 하고이 테이블을 참조하는 모든 sp를 식별해야합니다. 모든 sp의 목록을 찾기가 어렵습니다. 테이블 이름이 'x'이고 데이터베이스가 SQL Server 2005라고 가정하여 쿼리를 제안하십시오.




1
전문가에게 : 비 MS SQL 서버는 어떻습니까?
Deian

답변:


259
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

BTW-다음은 이러한 유형의 질문에 대한 유용한 리소스입니다 . SQL Server 시스템 카탈로그 쿼리 FAQ


3
접근을 통해이 작업을 수행 할 이유가 있습니까 ROUTINE_DEFINITION에가 INFORMATION_SCHEMA.ROUTINES?
Marie

1
@Marie-SQL-Server 2005 (AFAIK)에는 없습니다.
Chains

2
질문,이 솔루션 은 문자열 에서 참조 될 때 참조 된 객체를 찾 습니까? 같은set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark

1
@ Jeff.Clark-:-)를 쉽게 찾을 수있는 방법이 있습니다.하지만 절차 텍스트를 직접 검색하므로 찾을 수 있습니다.
Chains

2
예, 예 :이 테스트를 설정하는 나에게 시간이 걸릴 거라고, 난 그냥 :) 게으른 / 쉽게 답을 찾고 있었다
Jeff.Clark

27

다음은 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

1
영업 이익은 SQL-서버 2005에 대한 대답이 필요
체인

19

때때로 위의 쿼리는 올바른 결과를 제공하지 않으며 다음과 같이 테이블 종속성을 얻는 데 사용할 수있는 내장 프로 시저가 있습니다.

EXEC sp_depends @objname = N'TableName';

1
나에게 이것은 트리거 및 뷰를 보여 주었지만 저장된 proc는 보여주지 않았습니다.
NealWalters

1
참고 : 테이블에 액세스 할 수 있지만 Stored Procs는 액세스 할 수없는 시스템에서이를 실행 했으므로 물론 Stored Procs가 결과에 표시되지 않았습니다.
NealWalters

18

쿼리가 아닌 방법은 Sql Server Management Studio를 사용하는 것입니다.

테이블을 찾아 마우스 오른쪽 단추로 클릭하고 "종속성보기"를 선택하십시오.

편집하다

그러나 논평자들이 말했듯이, 그것은 신뢰할 만하지 않습니다.


4
2005 년에 개체가 올바른 순서로 작성되지 않으면 종속성 정보를 신뢰할 수 없습니다.
Martin Smith

3
@Martin Smith가 지적했듯이 존재하지 않는 객체를 참조하는 저장 프로시 저는 경고와 함께 생성되지만 항목은 sysdepends에 배치되지 않습니다. 또한 외부 데이터베이스의 테이블을 참조하는 저장 프로 시저에 대해서도 마찬가지입니다. 두 데이터베이스의 sysdepends에는 항목이 없습니다. 또 다른 특징은 테이블이나 뷰를 삭제 / 다시 작성하면 종속성 체인이 중단된다는 것입니다. 이러한 기능은 SQL Server의 종속성 추적을 거의 쓸모 없게 만듭니다.
Nicholas Carey

7

다음 쿼리는 모든 저장 프로 시저 이름과 해당 SP의 해당 정의를 가져옵니다.

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'

5
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를 검색하려고하면 둘 다에 대한 결과가 표시됩니다.


2
syscomments이러한 방식으로 쿼리 는 정의를 여러 행에 걸쳐 4000 개의 문자 청크로 나누기 때문에 긴 프로 시저에는 신뢰할 수 없습니다. sys.sql_modules이것을 피하십시오.
Martin Smith

1
좋은 지적. sys.sql_modules대신 사용하도록 업데이트했습니다 .
Tom H

3
syscomments는 내 질문에 모두 답글을
달았

5

아래 쿼리는 열에 대한 종속성이 아닌 테이블에 대한 종속성을 검색 할 때만 작동합니다.

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

1
나를 위해, SQL Server 12.0의 데이터베이스에 대해 실행중인 SSMS 2014에서 아무것도 반환하지 않았습니다)
NealWalters

3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

테이블 이름을 언급 해야하는 경우 작동합니다.


3

Management Studio에서는 마우스 오른쪽 버튼을 클릭하여 테이블을 클릭하고 '종속성보기'를 클릭하면됩니다. 여기에 이미지 설명을 입력하십시오

테이블에 의존성이있는 객체 목록을 볼 수있는 것보다 :여기에 이미지 설명을 입력하십시오


1

기본적으로 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를 포함하는 테이블이 있습니다.


0

이 시도

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.