一个列出表外键依赖层级的脚本

来源: http://sqlblog.com/blogs/jamie_thomson/archive/2009/09/08/deriving-a-list-of-tables-in-dependency-order.aspx

SET

NOCOUNT ON

;

DECLARE

@RITable

TABLE

(

object_id INT PRIMARY

KEY

,

SchemaName SYSNAME NOT

NULL

,

TableName SYSNAME NOT

NULL

,

RILevel tinyint DEFAULT

0

,

IsSelfReferencing tinyint DEFAULT

0

,

HasExcludedRelationship tinyint DEFAULT

0

,

UpdateCount tinyint DEFAULT

0

);

INSERT

@RITable

(

object_id

,

SchemaName

,

TableName

,

RILevel

,

IsSelfReferencing

,

HasExcludedRelationship

,

UpdateCount

)

SELECT

tables .

object_id

,

schemas .

name

,

tables .

name

,

0

,

SUM ( CASE WHEN foreign_keys . parent_object_id IS NULL THEN 0 ELSE 1 END

)

,

SUM ( CASE WHEN foreign_keys02 . referenced_object_id IS NULL THEN 0 ELSE 1 END

)

,

0

FROM

sys.tables

tables

JOIN

sys.schemas schemas ON tables . schema_id = schemas .

schema_id

LEFT

JOIN sys.foreign_keys foreign_keys ON tables . object_id = foreign_keys .

parent_object_id

AND

tables . object_id = foreign_keys .

referenced_object_id

LEFT

JOIN sys.foreign_keys foreign_keys01 ON tables . object_id = foreign_keys01 .

parent_object_id

LEFT

JOIN sys.foreign_keys foreign_keys02 ON foreign_keys01 . parent_object_id = foreign_keys02 .

referenced_object_id

AND

foreign_keys01 . referenced_object_id = foreign_keys02 .

parent_object_id

AND

foreign_keys01 . parent_object_id <> foreign_keys01 .

referenced_object_id

WHERE

tables . name NOT IN ( 'sysdiagrams' , 'dtproperties'

)

GROUP

BY tables .

object_id

,

tables . name

;

DECLARE

@LookLevel INT

;

DECLARE

@MyRowcount INT ;

SELECT

@LookLevel =

0

,

@MyRowcount = - 1 ;

WHILE

( @MyRowcount <> 0

)

BEGIN

UPDATE

ChildTable

SET

RILevel = @LookLevel +

1

,

UpdateCount = ChildTable . UpdateCount +

1

FROM

@RITable ChildTable

JOIN

sys.foreign_keys foreign_keys ON ChildTable . object_id = foreign_keys .

parent_object_id

JOIN @RITable ParentTable ON foreign_keys . referenced_object_id = ParentTable .

object_id

AND

ParentTable . RILevel =

@LookLevel

LEFT

JOIN sys.foreign_keys foreign_keysEX ON foreign_keys . parent_object_id = foreign_keysEX .

referenced_object_id

AND

foreign_keys . referenced_object_id = foreign_keysEX .

parent_object_id

AND

foreign_keys . parent_object_id <> foreign_keys .

referenced_object_id

WHERE

ChildTable . object_id <> ParentTable .

object_id

AND foreign_keysEX . referenced_object_id IS NULL;

SELECT

@MyRowcount = @@ROWCOUNT ;

SELECT

@LookLevel = @LookLevel + 1

;

END

;

SELECT

RITable .

SchemaName SchemaName

,

RITable .

TableName TableName

,

RITable .

RILevel RILevel

,

CASE WHEN RITable . IsSelfReferencing >

0

THEN

CAST ( 1 AS BIT

)

ELSE

CAST ( 0 AS BIT

)

END

IsSelfReferencing

,

CASE WHEN RITable . HasExcludedRelationship >

0

THEN

CAST ( 1 AS BIT

)

ELSE

CAST ( 0 AS BIT

)

END

HasExcludedRelationship

FROM

@RITable RITable

ORDER

BY RITable . RILevel

DESC

,

RITable . TableName ASC

;

-- Excluded relationships

SELECT

foreign_keys01 . name

ForeignKeyName

,

ParentSchema . name

ParentSchema

,

ParentObject . name

ParentTable

,

ChildSchema . name

ChildSchema

,

Childobject . name

ChildTable

FROM

sys.foreign_keys

foreign_keys01

JOIN

sys.foreign_keys foreign_keys02 ON foreign_keys01 . parent_object_id = foreign_keys02 .

referenced_object_id

AND

foreign_keys01 . referenced_object_id = foreign_keys02 .

parent_object_id

AND

foreign_keys01 . parent_object_id <> foreign_keys01 .

referenced_object_id

JOIN

sys.objects ParentObject ON foreign_keys01 . parent_object_id = ParentObject .

object_id

JOIN

sys.schemas ParentSchema ON ParentObject . schema_id = ParentSchema .

schema_id

JOIN

sys.objects Childobject ON foreign_keys01 . referenced_object_id = Childobject .

object_id

JOIN

sys.schemas ChildSchema ON Childobject . schema_id = ChildSchema . schema_id

;

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...