We had a similar requirement, here is our solution:(it will take care of selfreferences and circular relationships(by ignoring them))create function dbo.fnNestLevel(@object_id int) returns int asbegin /* returns the "nesting" of an object 0 = the object is a "top level" object, ie. it has no parents n = the object has n parents, ie how deeply it is nested example usage: select object_name(id) as table_name ,dbo.fnNestLevel(id) as nestlevel from sysobjects where type = 'u' order by 2, 1 --(specify 2 desc or 2 asc) */ declare @nestlevel int; set @nestlevel = -1 declare @nest table(nestlevel int not null, objid int) insert @nest(nestlevel,objid) select @nestlevel,@object_id while @@rowcount <> 0 begin set @nestlevel = @nestlevel + 1 insert @nest(nestlevel,objid) select @nestlevel, s.rkeyid from sysreferences s join @nest n on s.fkeyid = n.objid where n.nestlevel = @nestlevel - 1 and s.fkeyid <> s.rkeyid -- remove selfreferences and s.rkeyid not in(select objid from @nest) -- remove circular relationships end return @nestlevelendGOselect object_name(id) as table_name ,dbo.fnNestLevel(id) as nestlevelfrom sysobjectswhere type = 'u' order by 2 /*desc*/ , 1GOdrop function dbo.fnNestLevelGO
rockmoose