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,

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top