2009-05-06 9 views

Répondre

14
select * from sysobjects 
where xtype = 'F' 

Cela devrait faire l'affaire et être compatible avec SQL Server 2000, j'espère!

Si vous avez en outre besoin des informations de table et de colonne dans SQL Server 2000, cela devient un peu plus complexe; vous devez joindre les sysforeignkeys et syscolumns vues de catalogue comme ceci:

select 
    so.name 'foreign key name', 
    OBJECT_NAME(parent_obj) 'table', 
    OBJECT_NAME(sf.fkeyid) 'referencing table', 
    sc1.name 'referencing column', 
    OBJECT_NAME(sf.rkeyid) 'referenced table', 
    sc2.name 'referenced column' 
from sysobjects so 
inner join sysforeignkeys sf on so.id = sf.constid 
inner join syscolumns sc1 on sf.fkeyid = sc1.id and sf.fkey = sc1.colid 
inner join syscolumns sc2 on sf.rkeyid = sc2.id and sf.fkey = sc2.colid 
where so.xtype in ('F','PK') 

Et si vous voulez tirer parti des vues INFORMATION_SCHEMA qui sont effectivement disponibles dans SQL Server 2000, utilisez cette requête:

SELECT 
    rc.CONSTRAINT_NAME,  
    rcu.TABLE_NAME 'Referencing Table', 
    rcu.COLUMN_NAME 'Referencing Column', 
    rcu1.TABLE_NAME 'Referenced Table', 
    rcu1.COLUMN_NAME 'Referenced Column' 
FROM 
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc 
INNER JOIN 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu 
     ON rc.CONSTRAINT_CATALOG = rcu.CONSTRAINT_CATALOG 
     AND rc.CONSTRAINT_NAME = rcu.CONSTRAINT_NAME 
INNER JOIN 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu1 
     ON rc.UNIQUE_CONSTRAINT_CATALOG = rcu1.CONSTRAINT_CATALOG 
     AND rc.UNIQUE_CONSTRAINT_NAME = rcu1.CONSTRAINT_NAME 

Marc

+0

Comment obtenez-vous les colonnes? –

+0

La deuxième requête semble un peu étrange. Il semble qu'il manque une condition de jointure - j'ai un produit cartésien. – Rashack

+0

Vous avez réellement besoin de rejoindre sur 'sf.fkeyid = sc1.id et sf.fkey = sc1.colid' (et la même chose pour rkey) – Mark

4
select * from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 

Si vous avez besoin de plus d'informations sur la clé, vous pouvez le joindre à la vue INFORMATION_SCHEMA.KEY_COLUMN_USAGE, qui contient les colonnes référencées par la clé.

+1

Je ne pense pas que INFORMATION_SCHEMA était disponible dans SQL Server 2000 ..... (Je pense que c'était nouveau en 2005, non?) –

+2

Non. Il est disponible. Je l'ai vérifié par rapport à une instance SQL 2000 avant de le publier. –

+0

comment filtrez-vous sur les colonnes? –

1

Regardez la source de sp_helpconstraint pour plus d'idées, mais cela devrait fonctionner ...

pour obtenir tous les FK qui fait référence à la table cible & colonne

  • remplacer "yourtablename"
  • uncomment le dernier "ET" et définir votre nom de colonne cible

code:

--list all tables & columns that refer to the given table 
select 
    k.name,pt.Name AS ParentTable,pc.name,c.constraint_column_id,ct.Name AS ReferedToTable,c.referenced_column_id,cc.Name 
    from sys.foreign_keys     k 
     INNER JOIN sys.foreign_key_columns c ON k.parent_object_id=c.parent_object_id 
     INNER JOIN sys.objects    pt ON c.parent_object_id=pt.object_ID 
     INNER JOIN sys.objects    ct ON c.referenced_object_id=ct.object_ID 
     INNER JOIN sys.columns   pc ON c.parent_object_id=pc.object_ID AND c.parent_column_id=pc.column_id 
     INNER JOIN sys.columns   cc ON c.referenced_object_id=cc.object_ID AND c.referenced_column_id=cc.column_id 
    where k.referenced_object_id = object_id('YourTableName') 
     --AND pc.name='YourColumnName' --parent table column name 
     --AND cc.name='YourColumnName' --referenced table's column name 
+0

Encore une fois - le schéma "sys" n'est * pas * disponible dans SQL Server 2000 ... cela fonctionne très bien en 2005 et 2008. –

Questions connexes