>CREATE procedure test_fk_locator >@tablename varchar(36), @pkvalue uniqueidentifier > >as > >set nocount on > >declare @sqlstring nvarchar(500), @ParmDefinition NVARCHAR(500), > @fktablename varchar(36), @fkcolumnname varchar(36), > @fk_value uniqueidentifier, > @returntablename varchar(36), @returncolumnname varchar(36) > >declare fk_cursor CURSOR >for >SELECT TOP 100 PERCENT > sysobjects_1.name AS fktablename, > dbo.syscolumns.name AS fkcolumnname >FROM dbo.sysobjects >INNER JOIN > dbo.sysforeignkeys ON dbo.sysobjects.id = dbo.sysforeignkeys.rkeyid >INNER JOIN > dbo.sysobjects sysobjects_1 ON dbo.sysforeignkeys.fkeyid = sysobjects_1.id >INNER JOIN > dbo.syscolumns ON sysobjects_1.id = dbo.syscolumns.id AND > dbo.sysforeignkeys.fkey = dbo.syscolumns.colid >WHERE (dbo.sysobjects.name = @tablename) >ORDER BY > sysobjects_1.name, dbo.syscolumns.name > >open fk_cursor >FETCH NEXT FROM fk_cursor >INTO @fktablename, @fkcolumnname > >WHILE @@FETCH_STATUS = 0 >BEGIN > set @sqlstring = N'declare @retvalue uniqueidentifier;' + > 'select top 1 @retvalue = ' + > @fkcolumnname + ' from ' + > @fktablename + ' where ' + > @fkcolumnname + ' = @parentpk;' + > 'if @retvalue is not null select @rettablename as tablefailedon' > SET @ParmDefinition = N'@parentpk uniqueidentifier, ' + > '@rettablename varchar(36)' > EXECUTE sp_executesql @SQLString, @ParmDefinition, > @parentpk = @pkvalue, @rettablename = @fktablename > if @@ROWCOUNT > 0 > break > > FETCH NEXT FROM fk_cursor > INTO @fktablename, @fkcolumnname >end > >close fk_cursor >deallocate fk_cursor >GO > >>