외래 키의 순서에 따라 SQL Server에서 테이블 이름을 가져 오도록 쿼리를 프레임 할 수 있습니까?외래 키 종속성에 따라 테이블 이름을 가져 오는 SQL 쿼리
두 개의 다른 테이블에 외래 키 제약 조건이있는 기본 테이블 인 테이블 XYZ가있는 경우 먼저 테이블 XYZ를 표시해야합니다.
올바른 순서로 테이블을 만들 수 있습니다.
외래 키의 순서에 따라 SQL Server에서 테이블 이름을 가져 오도록 쿼리를 프레임 할 수 있습니까?외래 키 종속성에 따라 테이블 이름을 가져 오는 SQL 쿼리
두 개의 다른 테이블에 외래 키 제약 조건이있는 기본 테이블 인 테이블 XYZ가있는 경우 먼저 테이블 XYZ를 표시해야합니다.
올바른 순서로 테이블을 만들 수 있습니다.
다음과 같은 테이블에서 원하는 정보를 찾을 수 있습니다 거기에서
select * from sys.tables
select * from sys.foreign_keys
select * from sys.foreign_key_columns
, 당신이 필요로하는 바로 할 것입니다 스크립트를 구축 할 수 있습니다.
이 쿼리는 자신의 의존성 위해 테이블을 반환합니다
;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)
나는 이것이 조금 오래되었다는 것을 알고있다. 그러나 @Laurence가 지적했듯이 순환 종속성은 이것을 깨뜨릴 것이다. 'MAXRECUSRION'가'0'으로 설정되면 순환 종속성이있는 경우이 쿼리는 메모리 부족 시스템 예외가 발생할 때까지 실행됩니다. [parent_object_id = referenced_object_id]가 작동하는 레코드를 거부하도록 CTE에 제외를 추가 할 수 있습니다 ([this SQL Fiddle] (http://sqlfiddle.com/#!3/0d029/1)에서 설명). –
select * from sys.tables st
join sys.foreign_keys sfk on st.object_id = sfk.parent_object_id
where sfk.name = 'Foreign_Key'
그것은 외래 키가없는 테이블을 작성하고이 문제가하지 않는 한 다음 나중에이를 변경하는 것이 더 쉽습니다. 또한 순환 적 종속성을 가질 수 있기 때문에 일반적인 문제는 해결할 수 없습니다 (일반적으로 나쁜 설계 임에도 불구하고). – Laurence
보조 메모로 VS2010에서 SQL Server 프로젝트를 사용하면 자동으로 수행됩니다. –