2009-09-03 8 views
5

¿Alguien sabe cómo puedo ver cuáles son las claves externas & principales en una tabla?SQL Server 2008: averiguar la clave principal/externa en la tabla?

EDIT: Gracias por todas las respuestas. Estaba buscando una consulta SQL para hacer eso. En este momento estoy jugando con la escritura de una herramienta que me puede mostrar todas las tablas de un DB y mostrar las columnas. Me gustaría mostrar también cuáles de las claves son claves principales.

Esta es la forma en que leí el Catálogo Tabla:

const string sqlSelectTable = "SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE " + 
             "FROM INFORMATION_SCHEMA.TABLES " + 
             "WHERE TABLE_TYPE = 'BASE TABLE' " + 
             "ORDER BY TABLE_TYPE,TABLE_NAME"; 

y esto es cómo consigo las Informaciones sobre una columna:

const string sqlSelectTable = 
      "SELECT  COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH " + 
      "FROM   INFORMATION_SCHEMA.COLUMNS " + 
      "WHERE  (TABLE_NAME = @TABLE_NAME) " + 
      "ORDER BY ORDINAL_POSITION"; 

tendría que crear una Unión interna por lo ver cuales de las Columnas son la clave principal?

Saludos

Respuesta

11

Para la clave principal en cada tabla, puede utilizar esta consulta:

SELECT 
    kc.name, 
    c.NAME 
FROM 
    sys.key_constraints kc 
INNER JOIN 
    sys.index_columns ic ON kc.parent_object_id = ic.object_id 
INNER JOIN 
    sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id 
WHERE 
    kc.type = 'PK' 

y para la clave externa, creo que esta consulta debería proporcionarle la información necesaria:

SELECT 
    OBJECT_NAME(parent_object_id) 'Parent table', 
    c.NAME 'Parent column name', 
    OBJECT_NAME(referenced_object_id) 'Referenced table', 
    cref.NAME 'Referenced column name' 
FROM 
    sys.foreign_key_columns fkc 
INNER JOIN 
    sys.columns c 
     ON fkc.parent_column_id = c.column_id 
      AND fkc.parent_object_id = c.object_id 
INNER JOIN 
    sys.columns cref 
     ON fkc.referenced_column_id = cref.column_id 
      AND fkc.referenced_object_id = cref.object_id 

Marc

+0

n que no funciona. Devuelve todos los índices que ha creado. – Craig

+0

@Craig: consulta n. ° 1 ** solo ** devuelve claves primarias - la consulta n. ° 2 devuelve ** solo ** claves foráneas - o ¿qué obtienes? –

3

en Management Studio, expanda la tabla a continuación, expanda el elemento Columnas. La (s) clave (s) primaria (s) tiene un ícono de llave al lado de ellas.

Para ver las claves externas, expanda el elemento Restricciones.

1

Puede comenzar con:

SELECT 
    Table_Name as [TableName], 
    Column_Name as [ColumnName], 
    Constraint_Name as [Constraint], 
    Table_Schema as [Schema] 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
ORDER BY 
    [TableName], 
    [ColumnName] 

(se puede filtrar a continuación, por nombreTabla)

1
SELECT 
OBJECT_NAME(parent_object_id) 'Parent table', 
c.NAME 'Parent column name', 
OBJECT_NAME(referenced_object_id) 'Referenced table', 
cref.NAME 'Referenced column name' 
FROM 
sys.foreign_key_columns fkc 
INNER JOIN 
sys.columns c 
    ON fkc.parent_column_id = c.column_id 
     AND fkc.parent_object_id = c.object_id 
INNER JOIN 
sys.columns cref 
    ON fkc.referenced_column_id = cref.column_id 
     AND fkc.referenced_object_id = cref.object_id where OBJECT_NAME(parent_object_id) = 'tablename' 

Si desea obtener la relación de clave externa de todas las tablas excluye la cláusula else where escribir el nombre de tabla en lugar de tablename

Cuestiones relacionadas