Pregunta

Similar pero NO IDÉNTICO a SQL Server 2000 - Consulta a Relaciones de clave externa de la tabla

Necesito una instrucción T-SQL que funcione SQL 2000 que, dado un nombre de tabla, devolverá las relaciones de clave externa para esa tabla, por ejemplo,

Tabla MyFristTable tiene una clave foránea para MySecondTable, donde MyFirstTable.ColA debe estar en MySecondTable.ColB. Estaría encantado, si la instrucción sql (o el proceso almacenado) se ejecuta para MyFirstTable y devuelve un conjunto de resultados en las líneas de

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

NB : Tengo ejemplos para SQL 2005 que no funcionarán porque dependen de sys.foreign_key_columns

Prefiero no tener que analizar los resultados de la declaración sp_help.

Gracias,

¿Fue útil?

Solución

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

NOTA Creo que utilicé solo aquellas vistas del sistema disponibles en SQL 2000 (es decir, las sysXXX en lugar de las SQL 2005 sys.XXX) pero solo he probado esto en SQL 2005 medio ambiente.

Otros consejos

Tuve que hacer exactamente esto para una consulta, y encontré este procedimiento almacenado, después de probar una versión muy parecida a la tabla uno del sistema:

exec sp_fkeys @fktable_name = 'foo'

Parece que esto está disponible en SQL Server 2000 . Además, descubrí que en algunos casos había pequeñas diferencias entre este proceso almacenado y las consultas aquí. Supongo que sp_fkeys es la versión canónica.

Necesitaba algo como esto una vez, así que solo miré el código fuente del procedimiento almacenado del sistema y copié lo que necesitaba en mi propio procedimiento y lo hice funcionar como lo necesitaba.

Puede mirar el código fuente de sp_helpconstraint ...

Encontré esto en Google ... así que si este trabajo no es mi mérito. Espero que ayude

 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top