SQL 2000: T-SQL pour obtenir des relations de clé étrangère pour une table
-
06-07-2019 - |
Question
Similaire mais NON IDENTIQUE à SQL Server 2000 - Requête a Relations de la clé étrangère de la table
J'ai besoin d'une instruction T-SQL qui fonctionnera avec SQL 2000 et qui, à l'aide d'un nom de table, renvoie les relations de clé étrangère pour cette table, par exemple.
La table MyFristTable a une clé étrangère vers MySecondTable, où MyFirstTable.ColA doit être dans MySecondTable.ColB. Je serais ravi si l’instruction SQL (ou la procédure stockée) est exécutée pour MyFirstTable et renvoie un jeu de résultats sur les lignes de
Column | FK_Table | FK_COLUMN
----------------------------------
ColA | MySecondTable | ColB
Remarque : des exemples SQL 2005 ne fonctionnent pas car ils reposent sur sys.foreign_key_columns
Je préférerais ne pas avoir à analyser les résultats de l'instruction sp_help.
Merci,
La solution
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
REMARQUE Je pense que je n'utilisais que les vues système disponibles dans SQL 2000 (c'est-à-dire les vues sysXXX plutôt que celles de SQL 2005 sys.XXX), mais je n'ai en fait testé cela qu'avec SQL 2005. environemnt.
Autres conseils
Je devais faire la même chose pour une requête et j'ai trouvé cette procédure stockée, après avoir essayé une version très semblable à celle de la table sys:
exec sp_fkeys @fktable_name = 'foo'
Il semble que cela soit disponible dans SQL Server 2000 . En outre, j'ai constaté que dans quelques cas, il existait des différences mineures entre ce processus stocké et les requêtes ici. Je suppose que sp_fkeys est la version canonique.
J'avais besoin de quelque chose comme ça une fois, alors j'ai juste regardé le code source de la procédure stockée système et copié ce dont j'avais besoin dans ma propre procédure et l'ai fait fonctionner à ma guise.
Vous pouvez regarder le code source de sp_helpconstraint ...
Je l'ai trouvé dans google ... donc si ce travail n'est pas mon mérite. J'espère que ça va aider
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