SQL Server Script to Find Foreign Key Dependencies

Database Add comments

I used to be a fan of MS SQL Server 2000. It was so easy to get up and running.

But, SQL Server 2005, is another story. To do even the most basic of things, requires, extensive knowledge or ugly workarounds.

We do a lot of merge replication with SQL Server 2005. We added some tables to two-way merges, and the replication failed. as usual, it was due to foreign key dependencies. (By default, SQL Sevrer wants to drop the table, and re-create it with replication properties.)

There is no command that I know of, where you can select the PK, and say, give me all foreign keys that link to this PK. Easy enough Use Case though, right? There are some scripts out there to give similar column names, but those aren't accurate, because they dont have a foreign key reference necessarily.

After some searching, I found this. It was everything I needed. If you guys have better scripts, do share!

select cast(f.name  as varchar(255)) as foreign_key_name
    , r.keycnt
    , cast(c.name as  varchar(255)) as foreign_table
    , cast(fc.name as varchar(255)) as  foreign_column_1
    , cast(fc2.name as varchar(255)) as foreign_column_2
    ,  cast(p.name as varchar(255)) as primary_table
    , cast(rc.name as varchar(255))  as primary_column_1
    , cast(rc2.name as varchar(255)) as  primary_column_2
    from sysobjects f
    inner join sysobjects c on  f.parent_obj = c.id
    inner join sysreferences r on f.id =  r.constid
    inner join sysobjects p on r.rkeyid = p.id
    inner  join syscolumns rc on r.rkeyid = rc.id and r.rkey1 = rc.colid
    inner  join syscolumns fc on r.fkeyid = fc.id and r.fkey1 = fc.colid
    left join  syscolumns rc2 on r.rkeyid = rc2.id and r.rkey2 = rc.colid
    left join  syscolumns fc2 on r.fkeyid = fc2.id and r.fkey2 = fc.colid
    where f.type =  'F'
 ORDER BY cast(p.name as varchar(255))

 

2 responses to “SQL Server Script to Find Foreign Key Dependencies”

  1. ike Says:
    Well the standard for the JDBC sql.MetaData interface specifies two functions, getImportedKeys() and getExportedKeys() to return foreign key information for a given table. Of course imported keys are where the primary key is in the foreign table, but exported keys are like you described, where the primary key is in the table you're looking at. That being the case, and knowing that I've got the information from a java MetaData object against SQL 2005, I would think that there *has to* be something in SQL 2005 to provide that information. What or where I don't know. So that doesn't help you much if you need it within a SQL script.

    SQL Server does however support the information_schema standard and I would think you'd find that same information in the view information_schema.referential_constraints.

    hth
  2. Caribou Says:
    Here's a script I wrote a while back that might be a little more to the point.

    -- Not rocket science here, but it can save some digging when looking for
    -- a table that mysteriously references a table you're trying to drop.
    declare @tableName varchar(200)
    set @tableName = 'nativebatchoutputheader'
    select * from sys.foreign_keys k
    inner join sys.tables t on t.[object_id] = k.referenced_object_id
    where t.[name] = @tableName

Leave a Reply



Powered by Mango Blog. Design and Icons by N.Design Studio