4

与SQL Server 2000类似但不相同- 查询表的外键关系

我需要一个 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 语句的结果。

谢谢,

4

4 回答 4

13

我必须为查询做这件事,在尝试了一个很像 sys 表的版本之后,我发现了这个存储过程:

exec sp_fkeys @fktable_name = 'foo'

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

于 2010-02-16T16:53:43.677 回答
6
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 环境中实际测试过。

于 2009-06-22T12:03:41.807 回答
1

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

 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
于 2009-06-22T11:46:02.107 回答
1

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

您可能会查看 sp_helpconstraint 的源代码...

于 2009-06-22T11:53:43.353 回答