我想自己做一个叫做Relationship的表 该表中有4列 主键基表 主键列 外键基表 外键列
系统能够自动读取数据表间的信息存储到这个Relationship表中
用什么样的SQL语句 在哪些系统数据表间进行查询才能实现这样的功能??
我用的是SQL Server2008数据库
系统能够自动读取数据表间的信息存储到这个Relationship表中
用什么样的SQL语句 在哪些系统数据表间进行查询才能实现这样的功能??
我用的是SQL Server2008数据库
sys.default_constraints
sys.key_constraints
sys.foreign_keys
sysobjects.name AS 表名称 ,
syscolumns.name AS 字段名称 ,
systypes.name AS 字段类型 ,
syscolumns.length AS 字段长度 ,
ISNULL(COLUMNPROPERTY(syscolumns.id, syscolumns.name,'Scale'), 0) AS 小数位数 ,
CASE WHEN syscolumns.isnullable=0
THEN ''
ELSE ' √ '
END AS 是否为空 ,
CASE WHEN syscomments.text IS NULL
THEN '' ELSE syscomments.text
END AS 缺省值 ,
CASE WHEN COLUMNPROPERTY(syscolumns.id, syscolumns.name, 'IsIdentity')= 1
THEN ' √ ' ELSE ''
END AS 递增字段 ,
CASE WHEN sysindexes.name IS NULL
THEN ''
ELSE sysindexes.name
END AS 索引名称 ,
CASE WHEN sysindexkeys.keyno IS NULL
THEN ''
ELSE CONVERT(VARCHAR(10),sysindexkeys.keyno )
END AS 索引位置 ,
CASE WHEN sysindexes.indid=1
THEN ' 聚集索引 '
WHEN sysindexes.indid>1 AND sysindexes.indid<>255
THEN ' 非聚集索引 '
WHEN sysindexes.indid IS NULL
THEN ''
ELSE
' 其他 '
END AS 索引类型 ,
CASE WHEN EXISTS
(SELECT 1
FROM sysobjects
WHERE xtype = 'PK' AND name IN
(SELECT name
FROM sysindexes
WHERE indid IN
(SELECT indid
FROM sysindexkeys
WHERE id = syscolumns.id AND colid = syscolumns.colid)))
THEN ' √ ' ELSE ''
END AS 主键 ,
CASE WHEN sysforeignkeys.constid IS NULL
THEN ''
ELSE ' √ '
END AS 外健
FROM syscolumns -- 数据表字段
INNER JOIN sysobjects -- 数据对象
ON sysobjects.id = syscolumns.id
INNER JOIN systypes -- 数据类型
ON syscolumns.xtype = systypes.xtype
LEFT OUTER JOIN syscomments -- 注释信息
ON syscolumns.cdefault = syscomments.id
LEFT OUTER JOIN sysindexkeys -- 索引中的键或列的信息
ON sysindexkeys.id = syscolumns.id
AND sysindexkeys.colid = syscolumns.colid
LEFT OUTER JOIN sysindexes -- 数据库 索引表
ON sysindexes.id = sysindexkeys.id
AND sysindexes.indid = sysindexkeys.indid
LEFT OUTER JOIN sysforeignkeys
ON sysforeignkeys.fkeyid = syscolumns.id
AND sysforeignkeys.fkey = syscolumns.colid
WHERE (sysobjects.xtype = 'U')
order by sysobjects.id,syscolumns.colid
select FK_Name as [外键名],Parent_Tab_Name as [外键表],
[外键列]=stuff((select ','+[Parent_Col_Name] from (
select FK.name as FK_Name,Parent_Tab.Name as Parent_Tab_Name,Parent_Col.Name as Parent_Col_Name,
Referenced_Tab.Name as Referenced_Tab_Name,Referenced_Col.Name as Referenced_Col_Name
from sys.foreign_keys FK
inner join sys.foreign_key_columns Col on FK.Object_ID = Col.constraint_object_id
inner join sys.objects Parent_Tab ON Col.parent_object_id = Parent_Tab.Object_ID and Parent_Tab.TYPE = 'U'
inner join sys.columns Parent_Col on Parent_Tab.Object_ID = Parent_Col.object_id
and Col.parent_column_id = Parent_Col.column_id
inner join sys.objects Referenced_Tab ON Col.referenced_object_id = Referenced_Tab.Object_ID and Referenced_Tab.TYPE = 'U'
inner join sys.columns Referenced_Col on Referenced_Tab.Object_ID = Referenced_Col.object_id
and Col.referenced_column_id = Referenced_Col.column_id
)t where FK_Name=tb.FK_Name and Parent_Tab_Name = tb.Parent_Tab_Name and Referenced_Tab_Name = tb.Referenced_Tab_Name for xml path('')), 1, 1, ''),
Referenced_Tab_Name as [主键表],
[主键列]=stuff((select ','+[Referenced_Col_Name] from (
select FK.name as FK_Name,Parent_Tab.Name as Parent_Tab_Name,Parent_Col.Name as Parent_Col_Name,
Referenced_Tab.Name as Referenced_Tab_Name,Referenced_Col.Name as Referenced_Col_Name
from sys.foreign_keys FK
inner join sys.foreign_key_columns Col on FK.Object_ID = Col.constraint_object_id
inner join sys.objects Parent_Tab ON Col.parent_object_id = Parent_Tab.Object_ID and Parent_Tab.TYPE = 'U'
inner join sys.columns Parent_Col on Parent_Tab.Object_ID = Parent_Col.object_id
and Col.parent_column_id = Parent_Col.column_id
inner join sys.objects Referenced_Tab ON Col.referenced_object_id = Referenced_Tab.Object_ID and Referenced_Tab.TYPE = 'U'
inner join sys.columns Referenced_Col on Referenced_Tab.Object_ID = Referenced_Col.object_id
and Col.referenced_column_id = Referenced_Col.column_id
)t where FK_Name=tb.FK_Name and Parent_Tab_Name = tb.Parent_Tab_Name and Referenced_Tab_Name = tb.Referenced_Tab_Name for xml path('')), 1, 1, '')
--as [外键列]
from (
select FK.name as FK_Name,Parent_Tab.Name as Parent_Tab_Name,Parent_Col.Name as Parent_Col_Name,
Referenced_Tab.Name as Referenced_Tab_Name,Referenced_Col.Name as Referenced_Col_Name
from sys.foreign_keys FK
inner join sys.foreign_key_columns Col on FK.Object_ID = Col.constraint_object_id
inner join sys.objects Parent_Tab ON Col.parent_object_id = Parent_Tab.Object_ID and Parent_Tab.TYPE = 'U'
inner join sys.columns Parent_Col on Parent_Tab.Object_ID = Parent_Col.object_id
and Col.parent_column_id = Parent_Col.column_id
inner join sys.objects Referenced_Tab ON Col.referenced_object_id = Referenced_Tab.Object_ID and Referenced_Tab.TYPE = 'U'
inner join sys.columns Referenced_Col on Referenced_Tab.Object_ID = Referenced_Col.object_id
and Col.referenced_column_id = Referenced_Col.column_id
)tb
group by FK_Name,Parent_Tab_Name,Referenced_Tab_Name
from sysforeignkeys A, sysobjects X, sysobjects B, sysobjects C, syscolumns D, syscolumns E
where A.constid=X.id and A.fkeyid=B.id and A.rkeyid=C.id and A.fkey=D.colid and A.fkeyid=D.id and A.rkey=E.colid and A.rkeyid=E.id
不是我捣乱啊 在我的电脑上执行为什么没有结果 我查看了sysforeignkeys表 有很多行 但是运行就没结果
真出不来啊
不会传图片 的确没结果 select X.name [关系名称], PKTable.name [主键表], PK.[name] [主键列], FKTable.name [外键表], FK.[name] [外键列]
from sysforeignkeys A, sysobjects X, sysobjects FKTable, sysobjects PKTable, syscolumns FK, syscolumns PK
where A.constid=X.id
and A.fkeyid=FKTable.id
and A.rkeyid=PKTable.id
and A.fkey=FK.colid
and A.fkeyid=FK.id
and A.rkey=PK.colid
and A.rkeyid=PK.id没错呀