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,

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top