2009-05-06 5 views

답변

14
select * from sysobjects 
where xtype = 'F' 

SQL Server 2000과 호환되어야합니다.

SQL Server 2000에서 테이블과 열 정보가 추가적으로 필요하면 좀 더 복잡해집니다. 그렇게 같이 sysforeignkeyssyscolumns 카탈로그 뷰에 가입해야합니다 :

select 
    so.name 'foreign key name', 
    OBJECT_NAME(parent_obj) 'table', 
    OBJECT_NAME(sf.fkeyid) 'referencing table', 
    sc1.name 'referencing column', 
    OBJECT_NAME(sf.rkeyid) 'referenced table', 
    sc2.name 'referenced column' 
from sysobjects so 
inner join sysforeignkeys sf on so.id = sf.constid 
inner join syscolumns sc1 on sf.fkeyid = sc1.id and sf.fkey = sc1.colid 
inner join syscolumns sc2 on sf.rkeyid = sc2.id and sf.fkey = sc2.colid 
where so.xtype in ('F','PK') 

을 그리고 당신은 SQL Server 2000에서 실제로 사용할 수있는 INFORMATION_SCHEMA 뷰를 활용하려는 경우,이 쿼리를 사용

SELECT 
    rc.CONSTRAINT_NAME,  
    rcu.TABLE_NAME 'Referencing Table', 
    rcu.COLUMN_NAME 'Referencing Column', 
    rcu1.TABLE_NAME 'Referenced Table', 
    rcu1.COLUMN_NAME 'Referenced Column' 
FROM 
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc 
INNER JOIN 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu 
     ON rc.CONSTRAINT_CATALOG = rcu.CONSTRAINT_CATALOG 
     AND rc.CONSTRAINT_NAME = rcu.CONSTRAINT_NAME 
INNER JOIN 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu1 
     ON rc.UNIQUE_CONSTRAINT_CATALOG = rcu1.CONSTRAINT_CATALOG 
     AND rc.UNIQUE_CONSTRAINT_NAME = rcu1.CONSTRAINT_NAME 

마크

+0

어떻게 열을 가져 옵니까? –

+0

두 번째 쿼리가 조금 이상하게 보입니다. 그것은 어떤 종류의 결합 조건을 놓친 것 같습니다 - 나는 데카르트 곱을 얻었습니다. – Rashack

+0

실제로는'sf.fkeyid = sc1.id와 sf.fkey = sc1.colid' (그리고 rkey도 마찬가지입니다.) – Mark

4
select * from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 

키에 대한 추가 정보가 필요하면 다음을 포함하는 INFORMATION_SCHEMA.KEY_COLUMN_USAGE보기에 참여하십시오. 키에 의해 참조되는 열 이 작업을해야

+1

SQL Server 2000에서 INFORMATION_SCHEMA를 사용할 수 있다고 생각하지 않습니다 ..... 나는 그것이 2005 년에 새로운 것 같지 않습니까?) –

+2

No. 사용할 수 있습니다. 나는 그것을 게시하기 전에 SQL 2000 인스턴스에 대해 체크했다. –

+0

열을 어떻게 필터링합니까? –

1

더 많은 아이디어에 대한 sp_helpconstraint의 소스에서 봐,하지만 ...

& 열

  • 주석
  • 을 "YourTableName"를 대체에게 테이블을 대상으로 의미 모든 FK 얻을 수 마지막 "AND"및 대상 열 이름을 설정하십시오.

코드 :

--list all tables & columns that refer to the given table 
select 
    k.name,pt.Name AS ParentTable,pc.name,c.constraint_column_id,ct.Name AS ReferedToTable,c.referenced_column_id,cc.Name 
    from sys.foreign_keys     k 
     INNER JOIN sys.foreign_key_columns c ON k.parent_object_id=c.parent_object_id 
     INNER JOIN sys.objects    pt ON c.parent_object_id=pt.object_ID 
     INNER JOIN sys.objects    ct ON c.referenced_object_id=ct.object_ID 
     INNER JOIN sys.columns   pc ON c.parent_object_id=pc.object_ID AND c.parent_column_id=pc.column_id 
     INNER JOIN sys.columns   cc ON c.referenced_object_id=cc.object_ID AND c.referenced_column_id=cc.column_id 
    where k.referenced_object_id = object_id('YourTableName') 
     --AND pc.name='YourColumnName' --parent table column name 
     --AND cc.name='YourColumnName' --referenced table's column name 
+0

다시 "sys"스키마는 SQL Server 2000에서는 사용할 수 없습니다. * 2005 년과 2008 년에는 잘 작동합니다. –

관련 문제