Si alguna vez necesita encontrar todas las tablas que tienen una clave principal en SQL Server, este artículo puede ayudarlo.
Este artículo ofrece siete formas de devolver todas las tablas en la base de datos actual que tienen una clave principal.
Tenga en cuenta que la mayoría de estos ejemplos solo devuelven las tablas, no las claves principales en sí. Si desea una lista de claves principales, consulte 11 formas de devolver una clave principal en SQL Server.
Opción 1:OBJECTPROPERTY() con sys.tables
La primera opción implica el uso de OBJECTPROPERTY()
función al consultar el sys.tables
vista del sistema. Esta función acepta una TableHasPrimaryKey
argumento. Si este argumento tiene un valor de 1
, obtenemos todas las tablas que tienen una clave principal (si es 0
luego obtenemos todas las tablas que no tienen una clave principal).
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table];
Resultado:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
En este ejemplo, la base de datos actual tiene cuatro tablas con una clave principal.
Los ejemplos restantes consultarán la misma base de datos, por lo que los resultados serán los mismos para esas consultas.
Opción 2:OBJECTPROPERTY() con INFORMACION_ESQUEMA.TABLAS
Este ejemplo usa OBJECTPROPERTY()
de nuevo, pero esta vez estoy consultando INFORMATION_SCHEMA.TABLES
ver.
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') = 1 AND TABLE_TYPE='BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME;
Resultado:
+----------------+--------------+ | TABLE_SCHEMA | TABLE_NAME | |----------------+--------------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------------+--------------+
Opción 3:OBJECTPROPERTY() con sys.objects
Una vez más OBJECTPROPERTY()
viene al rescate. Esta vez estoy consultando sys.objects
vista del sistema.
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.objects WHERE type = 'U' AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table]
Resultado:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
Opción 4:INFORMACIÓN_ESQUEMA.TABLE_CONSTRAINTS
Puede consultar el INFORMATION_SCHEMA.TABLE_CONSTRAINTS
view para obtener una lista de tablas con claves principales. Debe filtrar los resultados solo para aquellas filas que tienen un CONSTRAINT_TYPE
de PRIMARY KEY
.
SELECT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';
Resultado:
+---------------------+--------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | |---------------------+--------------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +---------------------+--------------+
Esta vista también devuelve el nombre de la restricción, por lo que también puede incluir esa columna si es necesario:
SELECT CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';
Resultado:
+---------------------+--------------+-------------------------------+ | CONSTRAINT_SCHEMA | TABLE_NAME | CONSTRAINT_NAME | |---------------------+--------------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +---------------------+--------------+-------------------------------+
Opción 5:sys.key_constraints
Puede filtrar las sys.key_constraints
ver un CONSTRAINT_TYPE
de PK
para obtener una lista de tablas con claves principales.
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table] FROM sys.key_constraints WHERE type = 'PK';
Resultado:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +----------+---------+
Aquí está de nuevo con el nombre de la clave principal:
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], name FROM sys.key_constraints WHERE type = 'PK';
Resultado:
+----------+---------+-------------------------------+ | Schema | Table | name | |----------+---------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +----------+---------+-------------------------------+
Opción 6:sys.objetos
Los sys.objects
La vista del sistema es popular para devolver información sobre objetos del ámbito del esquema, incluidas las claves principales.
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table] FROM sys.objects WHERE type = 'PK';
Resultado:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Artists | | dbo | Genres | | dbo | Albums | | dbo | Country | +----------+---------+
Al igual que con los dos ejemplos anteriores, podemos incluir el name
columna de esta vista para mostrar el nombre de la clave principal:
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], name FROM sys.objects WHERE type = 'PK';
Resultado:
+----------+---------+-------------------------------+ | Schema | Table | name | |----------+---------+-------------------------------| | dbo | Artists | PK__Artists__25706B50FCD918B1 | | dbo | Genres | PK__Genres__0385057E88BB96F8 | | dbo | Albums | PK__Albums__97B4BE379FC780BD | | dbo | Country | PK__Country__10D1609F97ADEC31 | +----------+---------+-------------------------------+
Opción 7:OBJETOPROPIEDADEX()
El OBJECTPROPERTYEX()
la función funciona igual que OBJECTPROPERTY()
función, excepto que admite más propiedades. Por lo tanto, cualquiera de los ejemplos anteriores que usan OBJECTPROPERTY()
, podría reescribirse fácilmente para usar OBJECTPROPERTYEX()
.
Por ejemplo, podría reescribir el primer ejemplo de esta página de la siguiente manera:
SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table] FROM sys.tables WHERE OBJECTPROPERTYEX(object_id, 'TableHasPrimaryKey') = 1 ORDER BY [Schema], [Table];
Resultado:
+----------+---------+ | Schema | Table | |----------+---------| | dbo | Albums | | dbo | Artists | | dbo | Country | | dbo | Genres | +----------+---------+
Debo mencionar que OBJECTPROPERTYEX()
devuelve una sql_variant tipo de datos, mientras que OBJECTPROPERTY()
devuelve un int .