Als u ooit merkt dat u alle tabellen met een primaire sleutel in SQL Server moet vinden, kan dit artikel u helpen.
Dit artikel biedt zeven manieren om alle tabellen in de huidige database met een primaire sleutel te retourneren.
Merk op dat de meeste van deze voorbeelden alleen de tabellen retourneren - niet de primaire sleutels zelf. Als u een lijst met primaire sleutels wilt, raadpleegt u 11 manieren om een primaire sleutel in SQL Server te retourneren.
Optie 1 – OBJECTPROPERTY() met sys.tables
De eerste optie omvat het gebruik van de OBJECTPROPERTY()
functie bij het opvragen van de sys.tables
systeem bekijken. Deze functie accepteert een TableHasPrimaryKey
argument. Als dit argument een waarde heeft van 1
, krijgen we alle tabellen die een primaire sleutel hebben (als het 0
is) dan krijgen we alle tabellen die geen primaire sleutel hebben).
SELECT SCHEMA_NAME(schema_id) AS [Schema], naam AS [Tabel]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =1ORDER BY [Schema], [Tabel];
Resultaat:
+----------+---------+| Schema | Tabel ||----------+---------|| dbo | Albums || dbo | Artiesten || dbo | Land || dbo | Genres |+----------+---------+
In dit voorbeeld heeft de huidige database vier tabellen met een primaire sleutel.
De overige voorbeelden zullen dezelfde database doorzoeken, dus de resultaten zullen hetzelfde zijn voor die zoekopdrachten.
Optie 2 – OBJECTPROPERTY() met INFORMATION_SCHEMA.TABLES
Dit voorbeeld gebruikt OBJECTPROPERTY()
nogmaals, maar deze keer vraag ik de INFORMATION_SCHEMA.TABLES
bekijken.
SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') =1 ANDTABLE_TYPE='BASISTABEL'ORDER BY TABLE_SCHEMA;,pre>TABLE_NAME_SCHEMA;Resultaat:
+----------------+--------------+| TABLE_SCHEMA | TABLE_NAME ||----------------+--------------|| dbo | Albums || dbo | Artiesten || dbo | Land || dbo | Genres |+----------------+--------------+Optie 3 – OBJECTPROPERTY() met sys.objects
Nogmaals
OBJECTPROPERTY()
komt te hulp. Deze keer vraag ik desys.objects
systeemweergave.SELECT SCHEMA_NAME(schema_id) AS [Schema], naam AS [Table]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasPrimaryKey ') =1ORDER BY [Schema], [Tabel]Resultaat:
+----------+---------+| Schema | Tabel ||----------+---------|| dbo | Albums || dbo | Artiesten || dbo | Land || dbo | Genres |+----------+---------+Optie 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS
U kunt de
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
. opvragen view om een lijst met tabellen met primaire sleutels te krijgen. U moet de resultaten filteren op alleen die rijen met eenCONSTRAINT_TYPE
vanPRIMARY KEY
.SELECT CONSTRAINT_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='PRIMAIRE SLEUTEL';Resultaat:
+---------------------+--------------+| CONSTRRAINT_SCHEMA | TABLE_NAME ||---------------------+--------------|| dbo | Artiesten || dbo | Genres || dbo | Albums || dbo | Land |+---------------------+--------------+Deze weergave retourneert ook de naam van de beperking, dus u kunt desgewenst ook die kolom opnemen:
SELECT CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='PRIMAIRE SLEUTEL';Resultaat:
+---------------------+--------------+--------- ----------------------+| CONSTRRAINT_SCHEMA | TABLE_NAME | CONSTRAINT_NAME ||---------------------+--------------+---------- ---------------------|| dbo | Artiesten | PK__Artiesten__25706B50FCD918B1 || dbo | Genres | PK__Genres__0385057E88BB96F8 || dbo | Albums | PK__Albums__97B4BE379FC780BD || dbo | Land | PK__Land__10D1609F97ADEC31 |+--------------------+--------------+---------- ---------------------+Optie 5 – sys.key_constraints
U kunt de
sys.key_constraints
. filteren bekijk eenCONSTRAINT_TYPE
vanPK
om een lijst met tabellen met primaire sleutels te krijgen.SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table]FROM sys.key_constraints WHERE type ='PK';Resultaat:
+----------+---------+| Schema | Tabel ||----------+---------|| dbo | Artiesten || dbo | Genres || dbo | Albums || dbo | Land |+----------+---------+Hier is het weer met de naam van de primaire sleutel:
SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], nameFROM sys.key_constraints WHERE type ='PK';Resultaat:
+----------+---------+------------------------- ------+| Schema | Tafel | naam ||----------+---------+-------------------------- -----|| dbo | Artiesten | PK__Artiesten__25706B50FCD918B1 || dbo | Genres | PK__Genres__0385057E88BB96F8 || dbo | Albums | PK__Albums__97B4BE379FC780BD || dbo | Land | PK__Land__10D1609F97ADEC31 |+----------+---------+-------------------------- -----+Optie 6 – sys.objects
De
sys.objects
systeemweergave is populair voor het retourneren van informatie over objecten met schemabereik, inclusief primaire sleutels.SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table]FROM sys.objects WHERE type ='PK';Resultaat:
+----------+---------+| Schema | Tabel ||----------+---------|| dbo | Artiesten || dbo | Genres || dbo | Albums || dbo | Land |+----------+---------+Net als bij de vorige twee voorbeelden, kunnen we de
name
kolom van deze weergave om de naam van de primaire sleutel weer te geven:SELECT SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], nameFROM sys.objects WHERE type ='PK';Resultaat:
+----------+---------+------------------------- ------+| Schema | Tafel | naam ||----------+---------+-------------------------- -----|| dbo | Artiesten | PK__Artiesten__25706B50FCD918B1 || dbo | Genres | PK__Genres__0385057E88BB96F8 || dbo | Albums | PK__Albums__97B4BE379FC780BD || dbo | Land | PK__Land__10D1609F97ADEC31 |+----------+---------+-------------------------- -----+Optie 7 – OBJECTPROPERTYEX()
De
OBJECTPROPERTYEX()
functie werkt net als deOBJECTPROPERTY()
functie, behalve dat het meer eigenschappen ondersteunt. Daarom is elk van de voorgaande voorbeelden die gebruik maken vanOBJECTPROPERTY()
, kan gemakkelijk worden herschreven omOBJECTPROPERTYEX()
. te gebruiken .Ik zou bijvoorbeeld het eerste voorbeeld op deze pagina als volgt kunnen herschrijven:
SELECT SCHEMA_NAME(schema_id) AS [Schema], naam AS [Tabel]FROM sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasPrimaryKey') =1ORDER BY [Schema], [Tabel];Resultaat:
+----------+---------+| Schema | Tabel ||----------+---------|| dbo | Albums || dbo | Artiesten || dbo | Land || dbo | Genres |+----------+---------+Ik moet vermelden dat
OBJECTPROPERTYEX()
retourneert een sql_variant gegevenstype, terwijlOBJECTPROPERTY()
retourneert een int .