• if NOT exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[usp_DisplayTableRelation]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    exec sp_executesql N'CREATE procedure usp_DisplayTableRelation AS print 1'

    if NOT exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[usp_DisplayTableRelation1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    exec sp_executesql N'CREATE procedure usp_DisplayTableRelation1 AS print 1'

    go

    alter procedure usp_DisplayTableRelation

    @table_name nvarchar(128) -- the procedure will try to find all the child tables for the table @table_name

    as

    begin -- sp

    if @table_name is null

    return

    if not exists (select * from tempdb.dbo.sysobjects where name = N'##UsedTableName' )

    create table ##UsedTableName (TableName nvarchar(128))-- use to track recursive calls to same table

    else delete from ##UsedTableName

    if not exists (select * from tempdb.dbo.sysobjects where name = N'##DisplayTableRelation' )

    create table ##DisplayTableRelation (Relation nvarchar(4000))-- use to track recursive calls to same table

    else delete from ##DisplayTableRelation

    exec usp_DisplayTableRelation1 @table_name = @table_name

    select * from ##DisplayTableRelation

    drop table ##UsedTableName

    drop table ##DisplayTableRelation

    return

    end --sp

    go

    alter procedure usp_DisplayTableRelation1

    @table_name nvarchar(128) -- the procedure will try to find all the child tables for the table @table_name

    , @space_len int = -4 output -- for insert into ##DisplayTableRelation (Relation) selecting position purpose

    as

    begin -- sp

    declare @child nvarchar(128)

    declare @usedTable nvarchar(100)

    if @table_name is null

    return

    if not exists (select * from tempdb.dbo.sysobjects where name = N'##DisplayTableRelation' )

    begin

    exec usp_DisplayTableRelation @table_name

    return

    end

    set @space_len = @space_len + 4

    if not exists (select * from sysforeignkeys where rkeyid = object_id(@table_name) )

    begin -- leaf level

    if @space_len <= 0

    insert into ##DisplayTableRelation (Relation) select @table_name

    else

    insert into ##DisplayTableRelation (Relation) select space(@space_len) + '|---' + @table_name

    set @space_len = @space_len - 4

    return

    end -- leaf level

    else -- the @table_name table exists

    begin -- else

    set @usedTable = N''

    if exists (select * from ##UsedTableName where TableName = @table_name)

    set @usedTable = N' (Loop Reference)'

    else insert into ##UsedTableName (TableName) select @table_name

    if @space_len <= 0

    insert into ##DisplayTableRelation (Relation) select @table_name + @usedTable

    else

    insert into ##DisplayTableRelation (Relation) select space(@space_len) + '|---' + @table_name + @usedTable

    if (@usedTable = N'' --first time

    and exists ( select * from sysforeignkeys where rkeyid = object_id(@table_name) and rkeyid = fkeyid)) -- self referenced

    insert into ##DisplayTableRelation (Relation) select space(@space_len+4) + '|---' + @table_name

    declare curChild cursor local for

    select object_name(fkeyid) as child from sysforeignkeys

    where rkeyid = object_id(@table_name) and rkeyid <> fkeyid

    open curChild

    fetch next from curChild into @child

    while @@fetch_status = 0

    begin -- cursor loop

    if (@usedTable = N'') exec usp_DisplayTableRelation1 @table_name = @child, @space_len = @space_len output

    fetch next from curChild into @child

    end -- cursor loop

    close curChild

    deallocate curChild

    end --else

    set @space_len = @space_len - 4

    return

    end --sp