SQL 2000: T-SQL para obtener relaciones de clave externa para una tabla
-
06-07-2019 - |
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,
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