SELECT
FK_Table = FK.TABLE_NAME, FK_Column = CU.COLUMN_NAME, PK_Table = PK.TABLE_NAME, PK_Column = PT.COLUMN_NAME, Constraint_Name = C.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME INNER JOIN ( SELECT i1.TABLE_NAME, i2.COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' ) PT ON PT.TABLE_NAME = PK.TABLE_NAME -- optional: ORDER BY 1,2,3,4 |
If you want to limit it to specific tables, you can add any of the following immediately prior to the optional ORDER BY clause:
WHERE PK.TABLE_NAME='something'
WHERE FK.TABLE_NAME='something' WHERE PK.TABLE_NAME IN ('one_thing', 'another') WHERE FK.TABLE_NAME IN ('one_thing', 'another') |
Microsoft Access
Here is some code that uses ADOX.Catalog:
<%
Set conn = CreateObject("ADODB.Connection") Set cat = CreateObject("ADOX.Catalog") conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=<path to db>" Set cat.ActiveConnection = conn Response.Write "<table border=1><tr>" & _ "<th>Parent Table/Column</th>" & _ "<th>Child Table/Column</th>" & _ "<th>Key Name</th></tr>" For Each tbl in cat.Tables if left(tbl.Name, 4) <> "MSys" then For Each key in tbl.Keys If key.Type = 2 Then For Each col in key.Columns Response.Write "<tr><td>" & tbl.Name & "." & _ col.Name & "</td><td>" & _ key.RelatedTable & "." & _ col.RelatedColumn & "</td><td>" & _ key.Name & "</td></tr>" Next End If Next End If Next Response.Write "</table>" Set cat = Nothing conn.Close : Set conn = Nothing %> |
No comments:
Post a Comment