【问题标题】:SQL 2000: T-SQL to get foreign key relationships for a tableSQL 2000:T-SQL 获取表的外键关系
【发布时间】:2009-06-22 11:32:35
【问题描述】:

SQL Server 2000 - Query a Table’s Foreign Key relationships相似但不相同

我需要一个 T-SQL 语句,它可以在给定表名的 SQL 2000 中运行,并返回该表的外键关系,例如

表 MyFristTable 有一个指向 MySecondTable 的外键,其中 MyFirstTable.ColA 必须在 MySecondTable.ColB 中。如果为 MyFirstTable 运行 sql 语句(或存储过程)并在以下行返回结果集,我会很高兴

Column | FK_Table      | FK_COLUMN
----------------------------------
ColA   | MySecondTable | ColB

注意:我有 SQL 2005 的示例,因为它们依赖于 sys.foreign_key_columns,所以它们不起作用

我宁愿不必解析 sp_help 语句的结果。

谢谢,

【问题讨论】:

    标签: sql-server-2000 foreign-key-relationship


    【解决方案1】:

    我必须为查询做这件事,在尝试了一个与 sys 表非常相似的版本后,我发现了这个存储过程:

    exec sp_fkeys @fktable_name = 'foo'
    

    看起来这在SQL Server 2000 中可用。 此外,我发现在某些情况下,此存储过程与此处的查询之间存在细微差别。我猜 sp_fkeys 是规范版本。

    【讨论】:

    • 哇,我真的不明白为什么没有更多的投票!杰出的!我宁愿记住执行一个相当有名的存储过程,也不愿费心输入一个巨大的查询来获取它。
    • @Ogre:我迟到了几个月。 :)
    • 嗯,它的价值,它帮助了我,并希望能帮助未来的答案寻求者。
    【解决方案2】:
    DECLARE @tableName sysname
    
    SET @tableName = '' -- Your table name goes here
    
    SELECT
        c.name
        , target.name
        , targetc.name
    FROM
        -- source table
        sysobjects t
        -- source column
        INNER JOIN syscolumns c ON t.id = c.id
        -- general constraint
        INNER JOIN sysconstraints co ON t.id = co.id AND co.colid = c.colid
        -- foreign key constraint
        INNER JOIN sysforeignkeys fk ON co.constid = fk.constid
        -- target table
        INNER JOIN sysobjects target ON fk.rkeyid = target.id
        -- target column
        INNER JOIN syscolumns targetc ON fk.rkey = targetc.colid AND fk.rkeyid = targetc.id
    WHERE
        t.name = @tableName
    

    注意 我认为只使用了 SQL 2000 中可用的那些系统视图(即 sysXXX 的而不是 SQL 2005 sys.XXX 的),但我只在 SQL 2005 中实际测试过环境。

    【讨论】:

    • 这不包括与由多列组成的键的关系
    【解决方案3】:

    我曾经需要这样的东西,所以我只是查看了系统存储过程的源代码,并将我需要的内容复制到我自己的过程中,并根据需要使其工作。

    你可以看看 sp_helpconstraint 的源代码...

    【讨论】:

    • +1 建议查看系统 proc 的源代码,这是我永远不会想到的。谢谢老兄。
    【解决方案4】:

    我在谷歌找到了这个......所以如果这个工作不是我的优点。希望对你有帮助

     SELECT 
            FK_Table  = FK.TABLE_NAME, 
            FK_Column = CU.COLUMN_NAME, 
            PK_Table  = PK.TABLE_NAME, 
            PK_Column = PT.COLUMN_NAME, 
            Constraint_Name = C.CONSTRAINT_NAME 
        FROM 
            INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
            INNER JOIN 
            INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
                ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
            INNER JOIN 
            INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
                ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
            INNER JOIN 
            INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
                ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
            INNER JOIN 
            ( 
                SELECT 
                    i1.TABLE_NAME, i2.COLUMN_NAME 
                FROM 
                    INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
                    INNER JOIN 
                    INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
                    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
                    WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
            ) PT 
            ON PT.TABLE_NAME = PK.TABLE_NAME 
    
        WHERE PK.TABLE_NAME='something'    -- the table for you are asking
    

    【讨论】:

    • FK 约束可能不会引用另一个表上的 PK:可以使用任何唯一约束。
    • +1 :我的答案不完整,这是,所以我删除了我的,
    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2010-11-01
    • 2010-12-22
    • 1970-01-01
    • 2011-12-27
    • 2010-10-24
    相关资源
    最近更新 更多