Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

7 modi per restituire tutte le tabelle con una chiave primaria in SQL Server

Se ti capita di dover trovare tutte le tabelle che hanno una chiave primaria in SQL Server, questo articolo può essere di aiuto.

Questo articolo offre sette modi per restituire tutte le tabelle nel database corrente che dispongono di una chiave primaria.

Nota che la maggior parte di questi esempi restituisce solo le tabelle, non le chiavi primarie stesse. Se desideri un elenco di chiavi primarie, consulta 11 modi per restituire una chiave primaria in SQL Server.

Opzione 1 – OBJECTPROPERTY() con sys.tables

La prima opzione prevede l'utilizzo di OBJECTPROPERTY() durante la query su sys.tables vista del sistema. Questa funzione accetta un TableHasPrimaryKey discussione. Se questo argomento ha un valore di 1 , otteniamo tutte le tabelle che hanno una chiave primaria (se è 0 quindi otteniamo tutte le tabelle che non hanno una chiave primaria).

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema], 
  name AS [Table]
FROM sys.tables
WHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') = 1
ORDER BY [Schema], [Table];

Risultato:

+----------+---------+
| Schema   | Table   |
|----------+---------|
| dbo      | Albums  |
| dbo      | Artists |
| dbo      | Country |
| dbo      | Genres  |
+----------+---------+

In questo esempio, il database corrente ha quattro tabelle con una chiave primaria.

Gli esempi rimanenti interrogheranno lo stesso database, quindi i risultati saranno gli stessi per quelle query.

Opzione 2 – OBJECTPROPERTY() con INFORMATION_SCHEMA.TABLES

Questo esempio utilizza OBJECTPROPERTY() di nuovo, ma questa volta sto interrogando INFORMATION_SCHEMA.TABLES visualizza.

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;

Risultato:

+----------------+--------------+
| TABLE_SCHEMA   | TABLE_NAME   |
|----------------+--------------|
| dbo            | Albums       |
| dbo            | Artists      |
| dbo            | Country      |
| dbo            | Genres       |
+----------------+--------------+

Opzione 3 – OBJECTPROPERTY() con sys.objects

Ancora una volta OBJECTPROPERTY() viene in soccorso. Questa volta eseguo una query su sys.objects vista di 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]

Risultato:

+----------+---------+
| Schema   | Table   |
|----------+---------|
| dbo      | Albums  |
| dbo      | Artists |
| dbo      | Country |
| dbo      | Genres  |
+----------+---------+

Opzione 4 – SCHEMA_INFORMATIVO.TABLE_CONSTRAINTS

Puoi interrogare INFORMATION_SCHEMA.TABLE_CONSTRAINTS view per ottenere un elenco di tabelle con chiavi primarie. Devi filtrare i risultati solo per quelle righe che hanno un CONSTRAINT_TYPE di PRIMARY KEY .

SELECT  
  CONSTRAINT_SCHEMA, 
  TABLE_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';

Risultato:

+---------------------+--------------+
| CONSTRAINT_SCHEMA   | TABLE_NAME   |
|---------------------+--------------|
| dbo                 | Artists      |
| dbo                 | Genres       |
| dbo                 | Albums       |
| dbo                 | Country      |
+---------------------+--------------+

Questa vista restituisce anche il nome del vincolo, quindi puoi anche includere quella colonna, se necessario:

SELECT  
  CONSTRAINT_SCHEMA, 
  TABLE_NAME,
  CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';

Risultato:

+---------------------+--------------+-------------------------------+
| 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 |
+---------------------+--------------+-------------------------------+

Opzione 5 – sys.key_constraints

Puoi filtrare i sys.key_constraints visualizza un CONSTRAINT_TYPE di PK per ottenere un elenco di tabelle con chiavi primarie.

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  OBJECT_NAME(parent_object_id) AS [Table]
FROM sys.key_constraints 
WHERE type = 'PK';

Risultato:

+----------+---------+
| Schema   | Table   |
|----------+---------|
| dbo      | Artists |
| dbo      | Genres  |
| dbo      | Albums  |
| dbo      | Country |
+----------+---------+

Eccolo di nuovo con il nome della chiave primaria:

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  OBJECT_NAME(parent_object_id) AS [Table],
  name
FROM sys.key_constraints 
WHERE type = 'PK';

Risultato:

+----------+---------+-------------------------------+
| Schema   | Table   | name                          |
|----------+---------+-------------------------------|
| dbo      | Artists | PK__Artists__25706B50FCD918B1 |
| dbo      | Genres  | PK__Genres__0385057E88BB96F8  |
| dbo      | Albums  | PK__Albums__97B4BE379FC780BD  |
| dbo      | Country | PK__Country__10D1609F97ADEC31 |
+----------+---------+-------------------------------+

Opzione 6 – sys.objects

Il sys.objects la visualizzazione di sistema è molto utilizzata per restituire informazioni sugli oggetti con ambito schema, incluse le chiavi primarie.

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  OBJECT_NAME(parent_object_id) AS [Table]
FROM sys.objects 
WHERE type = 'PK';

Risultato:

+----------+---------+
| Schema   | Table   |
|----------+---------|
| dbo      | Artists |
| dbo      | Genres  |
| dbo      | Albums  |
| dbo      | Country |
+----------+---------+

Come per i due esempi precedenti, possiamo includere il name colonna di questa vista per visualizzare il nome della chiave primaria:

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema],
  OBJECT_NAME(parent_object_id) AS [Table],
  name
FROM sys.objects 
WHERE type = 'PK';

Risultato:

+----------+---------+-------------------------------+
| Schema   | Table   | name                          |
|----------+---------+-------------------------------|
| dbo      | Artists | PK__Artists__25706B50FCD918B1 |
| dbo      | Genres  | PK__Genres__0385057E88BB96F8  |
| dbo      | Albums  | PK__Albums__97B4BE379FC780BD  |
| dbo      | Country | PK__Country__10D1609F97ADEC31 |
+----------+---------+-------------------------------+

Opzione 7 – OBJECTPROPERTYEX()

Il OBJECTPROPERTYEX() la funzione funziona proprio come OBJECTPROPERTY() funzione, tranne per il fatto che supporta più proprietà. Pertanto, uno qualsiasi degli esempi precedenti che utilizzano OBJECTPROPERTY() , potrebbe essere facilmente riscritto per utilizzare OBJECTPROPERTYEX() .

Ad esempio, potrei riscrivere il primo esempio in questa pagina come segue:

SELECT 
  SCHEMA_NAME(schema_id) AS [Schema], 
  name AS [Table]
FROM sys.tables
WHERE OBJECTPROPERTYEX(object_id, 'TableHasPrimaryKey') = 1
ORDER BY [Schema], [Table];

Risultato:

+----------+---------+
| Schema   | Table   |
|----------+---------|
| dbo      | Albums  |
| dbo      | Artists |
| dbo      | Country |
| dbo      | Genres  |
+----------+---------+

Dovrei menzionare che OBJECTPROPERTYEX() restituisce una variante_sql tipo di dati, mentre OBJECTPROPERTY() restituisce un int .