与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
NB :我有SQL 2005的示例,因为它们依赖于sys.foreign_key_columns
而无效我宁愿不必解析sp_help语句的结果。
谢谢,
答案 0 :(得分:13)
我必须为查询做这件事,我在尝试了一个类似于sys表的版本之后找到了这个存储过程:
exec sp_fkeys @fktable_name = 'foo'
SQL Server 2000似乎可以使用此功能。 此外,我发现在少数情况下,此存储过程与此处的查询之间存在细微差别。我猜sp_fkeys是规范版本。
答案 1 :(得分: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中对此进行了测试environemnt。
答案 2 :(得分:1)
我在google中找到了这个...所以如果这项工作不是我的优点。希望有所帮助
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
答案 3 :(得分:1)
我需要这样的东西一次,所以我只看了系统存储过程的源代码,并将我需要的东西复制到我自己的程序中,并使其按照我的需要工作。
您可以查看sp_helpconstraint的源代码......