2012-11-01 4 views
1

외래 키의 순서에 따라 SQL Server에서 테이블 이름을 가져 오도록 쿼리를 프레임 할 수 있습니까?외래 키 종속성에 따라 테이블 이름을 가져 오는 SQL 쿼리

두 개의 다른 테이블에 외래 키 제약 조건이있는 기본 테이블 인 테이블 XYZ가있는 경우 먼저 테이블 XYZ를 표시해야합니다.

올바른 순서로 테이블을 만들 수 있습니다.

+2

그것은 외래 키가없는 테이블을 작성하고이 문제가하지 않는 한 다음 나중에이를 변경하는 것이 더 쉽습니다. 또한 순환 적 종속성을 가질 수 있기 때문에 일반적인 문제는 해결할 수 없습니다 (일반적으로 나쁜 설계 임에도 불구하고). – Laurence

+0

보조 메모로 VS2010에서 SQL Server 프로젝트를 사용하면 자동으로 수행됩니다. –

답변

-2

다음과 같은 테이블에서 원하는 정보를 찾을 수 있습니다 거기에서

select * from sys.tables 
select * from sys.foreign_keys 
select * from sys.foreign_key_columns 

, 당신이 필요로하는 바로 할 것입니다 스크립트를 구축 할 수 있습니다.

0

이 쿼리는 자신의 의존성 위해 테이블을 반환합니다

 ;WITH vwTableDependancy AS (
     SELECT 
      tables.object_id Dependant , NULL Parent 
     FROM 
      sys.tables 
     LEFT OUTER JOIN 
      sys.foreign_keys 
     ON 
      foreign_keys.parent_object_id = tables.object_id 
     WHERE 
      foreign_keys.parent_object_id IS NULL 
     UNION  
     SELECT 
      parent_object_id Dependant, referenced_object_id Parent 
     FROM 
      sys.foreign_keys 
    ) 
    , vwTableHierarchy AS (
     SELECT Dependant,Parent, 0 lvl FROM vwTableDependancy WHERE Parent IS NULL 
     UNION ALL 
     SELECT 
      vwTableDependancy.Dependant,vwTableDependancy.Parent , lvl+1 
     FROM 
      vwTableDependancy 
     INNER JOIN 
      vwTableHierarchy 
     ON 
      vwTableDependancy.Parent = vwTableHierarchy.Dependant 
    ) 
    SELECT 
     OBJECT_NAME(Dependant) Dependant 
     ,OBJECT_NAME(Parent) Parent 
     , lvl 
    FROM 
     vwTableHierarchy 
    ORDER BY 
     lvl ASC 
    OPTION(MAXRECURSION 0) 
+0

나는 이것이 조금 오래되었다는 것을 알고있다. 그러나 @Laurence가 지적했듯이 순환 종속성은 이것을 깨뜨릴 것이다. 'MAXRECUSRION'가'0'으로 설정되면 순환 종속성이있는 경우이 쿼리는 메모리 부족 시스템 예외가 발생할 때까지 실행됩니다. [parent_object_id = referenced_object_id]가 작동하는 레코드를 거부하도록 CTE에 제외를 추가 할 수 있습니다 ([this SQL Fiddle] (http://sqlfiddle.com/#!3/0d029/1)에서 설명). –

0
select * from sys.tables st 
join sys.foreign_keys sfk on st.object_id = sfk.parent_object_id 
where sfk.name = 'Foreign_Key'