2009-08-04 20 views

Respuesta

80

Uso esta afirmación, parece funcionar bastante bien.

SELECT RC.CONSTRAINT_NAME FK_Name 
, KF.TABLE_SCHEMA FK_Schema 
, KF.TABLE_NAME FK_Table 
, KF.COLUMN_NAME FK_Column 
, RC.UNIQUE_CONSTRAINT_NAME PK_Name 
, KP.TABLE_SCHEMA PK_Schema 
, KP.TABLE_NAME PK_Table 
, KP.COLUMN_NAME PK_Column 
, RC.MATCH_OPTION MatchOption 
, RC.UPDATE_RULE UpdateRule 
, RC.DELETE_RULE DeleteRule 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC 
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KF ON RC.CONSTRAINT_NAME = KF.CONSTRAINT_NAME 
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KP ON RC.UNIQUE_CONSTRAINT_NAME = KP.CONSTRAINT_NAME 
+3

¡Ten cuidado! 'INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS' omite algunas claves externas que' sys.foreign_keys' devuelve (en mi caso, una clave externa con 'Enforce For Replication' establecido en' No'. Terminé usando esta respuesta en su lugar: http: // stackoverflow. com/a/10697248/14731 – Gili

+0

¡Dios te bendiga por haberme salvado hoy! ¡No podía entender esto! – LearnByReading

8

Teóricamente, esto es difícil. El modelo relacional permite que cualquier campo se relacione con cualquier otro campo. Los que realmente se usan están definidos por todas las declaraciones SELECT posibles que podrían usarse.

Prácticamente, depende de cuántas tablas tengan incluidas las definiciones FK. Si alguien se molestó en definir cuidadosamente todas las referencias FK, y las declaraciones SELECT se apegan a estas reglas, puede consultarlas.

Sin embargo, desde una instrucción SELECT puede unirse en cualquier cosa, no hay garantía de que tiene menos que también haya todas las instrucciones SELECT todo de FK.


Editar.

Ver http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/11/26/viewing-all-foreign-key-constraints-in-sql-server.aspx

SELECT f.name AS ForeignKey, 
    OBJECT_NAME(f.parent_object_id) AS TableName, 
    COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName, 
    OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, 
    COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName 
FROM sys.foreign_keys AS f 
INNER JOIN sys.foreign_key_columns AS fc 
    ON f.OBJECT_ID = fc.constraint_object_id 

podría funcionar para usted.

+0

Todas las claves externas definidas se definen. ¿Cómo consultaría las claves extranjeras definidas? –

+1

Esto no es de ninguna manera una respuesta a la pregunta. Una clave externa es una cosa real, un objeto en la base de datos (o al menos una propiedad de un objeto). La pregunta no pide enumerar todas las columnas posibles a las que se puede unir, eso no tendría ningún sentido –

+0

@Byron Whitlock: "Todos" rara vez significa todo, por lo general significa "Todo excepto por unas pocas excepciones". –

5

utilizo http://technet.microsoft.com/en-us/library/ms189807.aspx

SELECT * FROM sys.foreign_keys 

Esto es, si usted está en al menos SQL Server 2005 + y desea ver una lista de los nombres de FK.

Pero es probable que desee saber más acerca de las tablas que están relacionadas también, ¿no es así ?, de ahí la respuesta es útil.

0

Aquí es una manera más informativa de presentarlo

SELECT DISTINCT PARENT_TABLE = 
      RIGHT(Replace(TC.constraint_name, 'FK_', ''), 
      Len(Replace(TC.constraint_name, 'FK_', '')) - Charindex('_', Replace(TC.constraint_name, 'FK_', ''))), 
      CHILD_TABLE = TC.table_name, 
      CU.column_name, 
      TC.constraint_name, 
      TC.constraint_type 
FROM information_schema.table_constraints TC 
INNER JOIN information_schema.constraint_column_usage CU 
      ON TC.constraint_name = CU.constraint_name 
WHERE TC.constraint_type LIKE '%foreign' 
      OR TC.constraint_type LIKE '%foreign%' 
      OR TC.constraint_type LIKE 'foreign%' 
Cuestiones relacionadas