Skip to content

Instantly share code, notes, and snippets.

@jay16
Created September 11, 2014 09:33
Show Gist options
  • Save jay16/329fc3435ca7e196b9d5 to your computer and use it in GitHub Desktop.
Save jay16/329fc3435ca7e196b9d5 to your computer and use it in GitHub Desktop.
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