一个列出表外键依赖层级的脚本
来源:互联网 发布:淘宝商品短链接怎么做 编辑:程序博客网 时间:2024/06/06 19:12
来源: 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
,
schemas.
name
,
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
;
- 一个列出表外键依赖层级的脚本
- windows编写一个小bat脚本 列出当前目录下所有的文件名到一个文本文件
- [maxsprict] 一个转换逐帧动画以及改变骨骼层级的脚本
- 列出.NET程序所依赖的Assembly
- Scripts:列出用户信息的脚本sec_users.sql
- Java day10 IO 列出文件下的所有层级文件名 待修改
- 构建一个模块的层级包
- 10.1 构建一个模块的层级包
- 测试Unity不同层级下的脚本调用顺序
- 如何列出一个目录占用的空间
- 把一个数组的组合全部列出
- 列出一个时间段内的每个日期
- 列出一个HTML文件的所有标签
- 列出一个数组里面的重复数字
- hbase 列出一个表所有的rowkey
- 【列出一个字符串的全字符组合】
- 列出一个文件夹下面的所有文件
- 列出一个目录下的所有文件
- Struts2中Action访问Servlet API的两种方法
- 设置telnet回显
- ajax有用的网址收藏
- HTTP请求流程:Telnet模拟HTTP请求
- 2009年9月语言排行榜:PHP排名第三
- 一个列出表外键依赖层级的脚本
- ListBox三级联动
- 额~~~根据现实。。。决定改看《ARM Cortex-M3权威指南》。。。
- SQLite 应用
- 永远的窗口
- struts2单选按钮
- 完美的纯CSS圆角
- WINDOWS 批处理 中途输入参数,如YES OR NO 等
- 长沙掌讯:3G时代SP市场新需求潜力巨大