2009-06-22 6 views
4

ähnlich aber nicht identisch zu SQL Server 2000 - Query a Table’s Foreign Key relationshipsSQL 2000: T-SQL Fremdschlüsselbeziehungen für einen Tisch zu bekommen

Ich brauche eine T-SQL-Anweisung, SQL 2000, die einen Tabellennamen angegeben, kehre den Fremdschlüssel funktioniert Beziehungen für diese Tabelle z

Tabelle MyFristTable hat einen Fremdschlüssel für MySecondTable, wobei MyFirstTable.ColA in MySecondTable.ColB enthalten sein muss. Ich würde erfreut sein, wenn die SQL-Anweisung (oder gespeicherte Prozedur) für MyFirstTable läuft und zurück eine Ergebnismenge auf den Linien von

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

NB: Ich habe Proben für SQL 2005, die nicht funktionieren weil sie sich auf sys.foreign_key_columns

verlassen Ich würde lieber nicht die Ergebnisse der sp_help-Anweisung analysieren müssen.

Danke,

Antwort

6
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 

HINWEIS Ich habe glaube ich, nur die Systemansichten in SQL 2000 (dh die sysXXX diejenigen, anstatt die SQL 2005 sys.XXX verwendet (Einsen), aber ich habe dies nur in einer Umgebung von SQL 2005 getestet.

+0

Excellent, genau das, was ich gesucht habe, danke Kumpel –

+0

Das schließt nicht Beziehungen mit Schlüsseln aus mehreren Spalten zusammen –

1

ich dies in google gefunden ... also, wenn diese Arbeit nicht mein Verdienst ist. Hoffe, dass es

helfen
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 
+2

FK-Constraints verweisen möglicherweise nicht auf die PK in der anderen Tabelle: Es kann eine beliebige eindeutige Constraint verwendet werden. – van

+0

"//" ist kein Kommentar, "-" ist ... –

+0

+1: Meine Antwort war nicht vollständig, das ist, also habe ich meine gelöscht, – Peter

1

ich so etwas wie dies einmal erforderlich, so dass ich auf den Quellcode des Systems gespeicherten Prozedur nur an und kopiert, was ich in mein eigenes Verfahren benötigt und machte es arbeiten, wie ich brauchte.

Sie bei sp_helpconstraint Quellcode aussehen könnte ...

+0

+1 für den Vorschlag, die Quelle des System-Procs zu betrachten, wäre mir das nie in den Sinn gekommen. Danke Kumpel. –

13

Ich hatte genau dieses Ding für eine Abfrage zu tun, und ich fand, diese gespeicherte Prozedur nach einer einer Version ähnlich wie die sys Tabelle versuchen:

exec sp_fkeys @fktable_name = 'foo' 

Es sieht aus wie dies in SQL Server 2000 zur Verfügung steht. Außerdem habe ich festgestellt, dass es in einigen Fällen geringfügige Unterschiede zwischen diesem gespeicherten Proc und den Abfragen gab. Ich vermute, dass sp_fkeys die kanonische Version ist.

+1

Wow, ich kann wirklich nicht verstehen, warum dies nicht mehr abgestimmt wurde! Brillant! Ich würde mich lieber daran erinnern, einen ziemlich gut benannten Stored Proc auszuführen, als sich mit der Eingabe einer großen Abfrage zu beschäftigen, um das zu bekommen. –

+0

@ Ogre: Ich war ein paar Monate zu spät. :) – Chris

+0

Nun, für das, was es wert ist, hat es mir geholfen und hoffentlich zukünftigen Suchenden helfen. –