Skip to content

Instantly share code, notes, and snippets.

@ax4413
Created May 22, 2014 14:36
Show Gist options
  • Save ax4413/fb3df8418db2262e1523 to your computer and use it in GitHub Desktop.
Save ax4413/fb3df8418db2262e1523 to your computer and use it in GitHub Desktop.
DYNAMIC DDL FOREIGN KEY DEFFINITIONS FROM SYSTEM VIEWS
SELECT DISTINCT 'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(pt.schema_id) )+ '.' + QUOTENAME(pt.name)
+ CASE FK.is_disabled WHEN 1 THEN ' WITH NOCHECK ' ELSE ' WITH CHECK ' END
+ 'ADD CONSTRAINT ' + QUOTENAME(fk.name) + ' FOREIGN KEY (' + ptc.ColumnList + ') '
+ 'REFERENCES ' + QUOTENAME(SCHEMA_NAME(rt.Schema_id)) + '.' + QUOTENAME(rt.name)
+ ' (' + rtc.ColumnList + ')'
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN sys.tables pt ON pt.object_id = fk.parent_object_id
INNER JOIN sys.tables rt ON rt.object_id = fkc.referenced_object_id
CROSS APPLY (SELECT DISTINCT STUFF((SELECT ', ' + QUOTENAME(c.name)
FROM sys.foreign_key_columns fkc
INNER JOIN sys.columns c
ON c.object_id = fkc.parent_object_id
AND c.column_id = fkc.parent_column_id
WHERE fkc.constraint_object_id = fk.object_id
ORDER BY fkc.constraint_column_id
FOR XML PATH('')),1,1,'') AS ColumnList
)ptc
CROSS APPLY (SELECT DISTINCT STUFF((SELECT ', ' + QUOTENAME(c.name)
FROM sys.foreign_key_columns fkc
INNER JOIN sys.columns c
ON c.object_id = fkc.referenced_object_id
AND c.column_id = fkc.referenced_column_id
WHERE fkc.constraint_object_id = fk.object_id
ORDER BY fkc.constraint_column_id
FOR XML PATH('')),1,1,'') AS ColumnList
)rtc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment