SQL

특정 조건의 SP 찾는 쿼리

이노(inno) 2014. 3. 17. 14:56


레가시 테이블과 자료형 등이 틀리다거나 해서 특정 조건의 테이블에 종속된 SP(저장 프로시져)들을 찾아서 수정할 목적으로 만듬.

select

distinct object_name(sd.id)

from sysdepends as sd

inner join syscolumns as sc

on sd.depid = sc.id

inner join sysobjects as so

on sd.id = so.id

inner join systypes as st

on sc.xtype = st.xtype

where

sc.name = 'vcname'
and st.name = 'varchar'
and sc.length = 10
and so.xtype = 'P'

order by

object_name(sd.id) asc


이제부터 설명.
vcname이라는 칼럼이 varchar(10)인 테이블들에 종속된 SP들을 찾는게 목적.
일단 테이블,뷰의 칼럼정보와 SP들의 매개변수에 대한 정보가 있는 시스템 테이블인 syscolumns 테이블에서 이름이 vcname이고 데이터타입이 varchar(10)인 칼럼이 있는 테이블들을 조회했다.
여기서 데이터타입 정보는 데이터타입과 길이 로 나뉘어 저장되는데 데이터타입에 대한 정보는 systypes 테이블에 상세히 기록되어있고 그외의 각 테이블들에는 xtype 칼럼으로 저장된다.
따라서 varchar의 xtype값을 찾기 위해 systypes 테이블을 조회해서 값을 알아오거나 위의 쿼리처럼 두 테이블을 조인해서 systypes의 name칼럼을 검색하면 된다.
이제 vcname varchar(10)을 포함한 테이블 정보를 알았으니 이 정보를 각 개체의 종속 관계를 저장한 시스템 테이블인 sysdepends와 조인해서 해당 테이블들에 종속된 SP들을 조회한다. sysdepends 테이블의 id칼럼은 아들 개체의 object_id를 depid 칼럼은 부모 개체의 object_id를 나타낸다. 따라서 위에서 찾은 테이블들의 object_id와 sysdepends 테이블의 depid와 조인을 통해 해당 테이블에 종속된 개체을 조회할 수 있다.
조회된 개체 중 SP만을 선별해서 조회하기 위해서는 각 개체들의 정보를 저장하고 있는 시스템 테이블인 sysobjects와 조인이 필요하다. sysobejcts 중 xtype 칼럼이 개체의 유형에 대한 정보를 담고 있는데 이중 주로 사용되는 항목으로는 U(테이블),V(뷰),P(저장 프로시져),S(시스템 기본 테이블),PK(기본키),F(참조키),D(기본값),C(check제약조건) 등이 있다. SP들만 선별하여 조회하기 위해서 sysobjects의 xtype이 P 인 개체들만 조회하도록 검색 조건을 추가하였다.