SQL 2000: T-SQL per ottenere relazioni di chiave esterna per una tabella
-
06-07-2019 - |
Domanda
Simile ma NON IDENTICO a SQL Server 2000 - Richiesta a Le relazioni con le chiavi esterne della tabella
Ho bisogno di un'istruzione T-SQL che funzionerà con SQL 2000 che forniva un nome di tabella, restituirà le relazioni di chiave esterna per quella tabella, ad esempio
La tabella MyFristTable ha una chiave esterna per MySecondTable, dove MyFirstTable.ColA deve trovarsi in MySecondTable.ColB. Sarei felice se l'istruzione sql (o stored process) viene eseguita per MyFirstTable e restituisca un set di risultati sulle righe di
Column | FK_Table | FK_COLUMN
----------------------------------
ColA | MySecondTable | ColB
NB : ho degli esempi per SQL 2005 che non funzioneranno perché si basano su sys.foreign_key_columns
Preferirei non dover analizzare i risultati dell'istruzione sp_help.
Grazie,
Soluzione
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 Penso di aver usato solo quelle viste di sistema disponibili in SQL 2000 (ovvero quelle sysXXX anziché quelle di SQL 2005 sys.XXX) ma in realtà l'ho testato solo in un SQL 2005 environemnt.
Altri suggerimenti
Ho dovuto fare esattamente questa cosa per una query e ho trovato questa procedura memorizzata, dopo aver provato una versione molto simile a quella della tabella sys:
exec sp_fkeys @fktable_name = 'foo'
Sembra che questo sia disponibile in SQL Server 2000 . Inoltre, ho scoperto che in alcuni casi c'erano piccole differenze tra questo proc memorizzato e le query qui. Immagino che sp_fkeys sia la versione canonica.
Una volta avevo bisogno di qualcosa del genere, quindi ho appena guardato il codice sorgente della procedura memorizzata nel sistema e copiato quello che mi serviva nella mia procedura e l'ho fatto funzionare come avevo bisogno.
Potresti guardare il codice sorgente di sp_helpconstraint ...
L'ho trovato su Google ... quindi se questo lavoro non è merito mio. Spero che sia d'aiuto
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