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 .