sql >> Base de Datos >  >> RDS >> Sqlserver

7 formas de devolver todas las tablas con una clave principal en SQL Server

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 .