Created
September 11, 2014 09:33
-
-
Save jay16/329fc3435ca7e196b9d5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
WITH CTE_FKCols | |
AS ( | |
SELECT FK.NAME | |
,'[' + STUFF(( | |
SELECT ',' | |
,object_name(Col.object_id) + '.' + col.NAME | |
FROM sys.foreign_key_columns C | |
INNER JOIN sys.columns Col ON Col.object_id = c.referenced_object_id | |
AND col.column_id = c.referenced_column_id | |
WHERE C.constraint_object_id = FK.object_id | |
FOR XML PATH('') | |
), 1, 1, '') + ']' Cols | |
FROM sys.foreign_keys FK | |
) | |
,CTE | |
AS ( | |
SELECT fk.create_date | |
,fk.modify_date | |
,fkc.constraint_object_id AS ConstraintId | |
,OBJECT_NAME(fkc.constraint_object_id) AS ConstraintName | |
,OBJECT_NAME(fkc.referenced_object_id) AS PrimaryKeyTableName | |
, Col2.name as PK_Name | |
,OBJECT_NAME(fk.parent_object_id) AS ForeignKeyTableName | |
, Col1.name as FK_Name | |
FROM sys.foreign_key_columns fkc | |
INNER JOIN sys.foreign_keys fk ON fk.OBJECT_ID = fkc.constraint_object_id | |
INNER JOIN sys.columns Col1 ON Col1.object_id = fkc.parent_object_id AND col1.column_id = fkc.parent_column_id | |
INNER JOIN sys.columns Col2 ON Col2.object_id = fkc.referenced_object_id AND col2.column_id = fkc.referenced_column_id | |
) | |
,cte2 ( | |
create_date | |
,modify_date | |
,ConstraintName | |
,PrimaryKeyTableName | |
, PK_Name | |
,ForeignKeyTableName | |
,FK_Name | |
,Hops | |
,path | |
) | |
AS ( | |
SELECT create_date | |
,modify_date | |
,ConstraintName | |
,PrimaryKeyTableName | |
, PK_Name | |
,ForeignKeyTableName | |
, FK_Name | |
,1 | |
,CAST('[' AS NVARCHAR(4000)) + cte.PrimaryKeyTableName + '].[' +cte.PK_Name + ']' | |
FROM cte | |
UNION ALL | |
SELECT cte.create_date | |
,cte.modify_date | |
,cte.ConstraintName | |
,cte.PrimaryKeyTableName | |
,cte.PK_Name | |
,cte.ForeignKeyTableName | |
,cte.FK_name | |
,cte2.Hops + 1 | |
, cte2.path + CAST('-> [' AS NVARCHAR(4000)) + cte2.ForeignKeyTableName + '].[' +cte2.FK_Name + ']' | |
FROM cte2 | |
INNER JOIN cte ON cte2.ForeignKeyTableName = cte.PrimaryKeyTableName | |
AND cte2.PrimaryKeyTableName != cte.PrimaryKeyTableName --Remove self-reference | |
) | |
SELECT * FROM cte2 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment