Friday, September 30, 2016

SQL to find Missing Foreign Keys in Child Tables

declare 
@table_name varchar(50),
@column_name varchar(50),
@constraint_name varchar(50),
@int int,
@Mint int

declare @pk_tbls table
(idn numeric(18) identity(1,1),
table_name varchar(30),
column_name varchar(30),
constraint_name varchar(30)) 

declare @missing_fk_cols table
(idn numeric(18) identity(1,1),
table_name varchar(30),
column_name varchar(30)) 

insert into @pk_tbls(table_name,column_name,constraint_name)
select table_name,column_name,CONSTRAINT_NAME from information_schema.constraint_column_usage
where CONSTRAINT_NAME like '%pk'

select @Mint = max(idn) from @pk_tbls 

set @int = 1

while @mint >= @int 

begin

select @table_name = table_name, @column_name = column_name,@constraint_name = constraint_name from @pk_tbls where idn = @int

insert into @missing_fk_cols(table_name,column_name) 
select TABLE_NAME,COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS 
where column_name = @column_name
and table_name not like 'v_%'
and table_name not in 
(select substring(CONSTRAINT_NAME,1,(len(CONSTRAINT_NAME)-4)) tblname  from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
where UNIQUE_CONSTRAINT_NAME = @constraint_name)
and table_name <> substring(@constraint_name,1,(len(@constraint_name)-3))

set @int = @int+1

end

select * from @pk_tbls
select * from @missing_fk_cols