import java.io.FileInputStream; import java.sql.*; import java.util.Properties; public class FkPairs { public static void main(String[] args) throws Exception { Properties props = new Properties(); try (FileInputStream in = new FileInputStream(args[0])) { props.load(in); } try (Connection conn = DriverManager.getConnection(props.getProperty("url"), props.getProperty("username"), props.getProperty("password"))) { String sql = "SELECT OBJECT_NAME(fk.parent_object_id) AS parent_table, " + " OBJECT_NAME(fk.referenced_object_id) AS ref_table, " + " fk.name AS fk_name, " + " STRING_AGG(pc.name + ' -> ' + rc.name, ', ') WITHIN GROUP (ORDER BY fkc.constraint_column_id) AS cols " + "FROM sys.foreign_keys fk " + "JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id " + "JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fkc.parent_column_id " + "JOIN sys.columns rc ON rc.object_id = fk.referenced_object_id AND rc.column_id = fkc.referenced_column_id " + "WHERE fk.parent_object_id <> fk.referenced_object_id " + "GROUP BY fk.name, fk.parent_object_id, fk.referenced_object_id " + "ORDER BY parent_table, fk_name"; try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(sql)) { System.out.println("=== CROSS-TABLE FK ASSOCIATIONS (two tables linked) ==="); String curPair = ""; int n = 0; while (rs.next()) { String pair = rs.getString("parent_table") + " -> " + rs.getString("ref_table"); if (!pair.equals(curPair)) { curPair = pair; n++; System.out.println(); System.out.println("[" + n + "] " + pair); } System.out.println(" FK " + rs.getString("fk_name") + " ( " + rs.getString("cols") + " )"); } } } } }