我想自己做一个叫做Relationship的表 该表中有4列 主键基表 主键列 外键基表 外键列 
系统能够自动读取数据表间的信息存储到这个Relationship表中
用什么样的SQL语句 在哪些系统数据表间进行查询才能实现这样的功能??
我用的是SQL Server2008数据库

解决方案 »

  1.   

    sysconstraints sys.check_constraints
    sys.default_constraints
    sys.key_constraints
    sys.foreign_keys 
      

  2.   

    给你个提示,获取包括表、字段、字段类型、字段长度、是否为空、是否递增字段、索引名称、索引的定位、索引类型、主键、外键等;通过合理的裁剪可以很方便的生成相应的数据字典。 自己改下SELECT
    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
      

  3.   

    -查询外键约束
    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
      

  4.   

    这个只查询关系名称,主键表,主键列,外键表,外键列select X.name [关系名称], C.name [主键表], E.[name] [主键列], B.name [外键表], D.[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
      

  5.   


    不是我捣乱啊  在我的电脑上执行为什么没有结果 我查看了sysforeignkeys表  有很多行 但是运行就没结果
      

  6.   

    你确定,我这边在SQL2000与2008都试过了,可以查询出结果的
      

  7.   


    真出不来啊 
    不会传图片 的确没结果 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没错呀