Hvis du nogensinde har brug for at finde ud af, om en database har nogen tabeller, der ikke har en primær nøgle, kan du køre et af følgende scripts i SQL Server for at returnere netop disse tabeller.
Alle disse scripts drager fordel af OBJECTPROPERTY()
fungere. Denne funktion accepterer en TableHasPrimaryKey
argument, som du kan tjekke for en værdi på 0
. Hvis det er 0
, tabellen har ikke en primær nøgle. Hvis det er 1
det gør det. Derfor kan du også bruge denne funktion til at returnere alle tabeller med en primær nøgle.
Disse scripts returnerer blot navnet på tabellen og dens skema, men du kan altid ændre dem for at returnere flere kolonner.
Mulighed 1 – OBJECTPROPERTY() med sys.tables
sys.tables
systemvisning er nok det mest oplagte sted at starte. Denne visning returnerer en række for hver brugertabel, og når vi bruger OBJECTPROPERTY()
for at filtrere resultaterne baseret på TableHasPrimaryKey
egenskab er 0
, får vi kun de tabeller uden en primær nøgle.
BRUG Test;VÆLG SCHEMA_NAME(skema_id) SOM [Skema], navn SOM [Tabel]FRA sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Skema], [Tabel];
Resultat:
Ændrede databasekontekst til 'Test'.+-----+--------------------+| Skema | Tabel ||---------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatotimeoffsetTest || dbo | Individuel || dbo | Beskæftigelse || dbo | Hold || dbo | TimeTest |+----------+---------------------+(7 rækker påvirket)
I dette tilfælde er min nuværende database en testdatabase med en masse tabeller uden primærnøgler.
Hvis jeg kører den samme sætning på en anden database, får jeg ingen resultater:
BRUG musik;VÆLG SCHEMA_NAME(skema_id) SOM [Skema], navn SOM [Tabel]FRA sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Skema], [Tabel];
Resultat:
Ændrede databasekontekst til 'Musik'.(0 rækker påvirket)
Mulighed 2 – OBJECTPROPERTY() med INFORMATION_SCHEMA.TABLES
Dette eksempel ligner det forrige, bortset fra denne gang, at jeg forespørger på INFORMATION_SCHEMA.TABLES
udsigt. Informationsskemavisningerne inkluderet i SQL Server overholder ISO-standarddefinitionen for INFORMATION_SCHEMA.
BRUG Test;VÆLG TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TabelHasPrimaryKey') =0 ANDTABLE_BYNAVN TABLE_TYPE='TABLE_BYPE_TYPE='TABLE_BYPE='TABLE_BYPE='TABLE_BYPE='TABLE_BEST.>Resultat:
Ændrede databasekontekst til 'Test'.+----------------+--------------------+ | TABLE_SCHEMA | TABLE_NAME ||----------------+------------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatotimeoffsetTest || dbo | Individuel || dbo | Beskæftigelse || dbo | Hold || dbo | TimeTest |+----------------+---------------------+(7 rækker påvirket)Mulighed 3 – OBJECTPROPERTY() med sys.objects
I dette eksempel forespørger jeg
sys.objects
udsigt. Dette er en mere generel visning sammenlignet med de to foregående, og den returnerer information om skema-omfattede objekter (ikke kun tabeller). På grund af dette er vi nødt til at filtrere resultaterne ved hjælp aftype = 'U'
.U
står her for brugerdefineret tabel.Igen kan vi bruge
OBJECTPROPERTY()
funktion til at filtrere resultaterne til kun de tabeller, der ikke har en primær nøgle.USE Test;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') =0ORDER BY [Skema], [Tabel]Resultat:
Ændrede databasekontekst til 'Test'.+-----+--------------------+| Skema | Tabel ||---------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatotimeoffsetTest || dbo | Individuel || dbo | Beskæftigelse || dbo | Hold || dbo | TimeTest |+----------+---------------------+(7 rækker påvirket)Vi kunne alternativt filtrere det efter
type_desc = 'USER_TABLE'
, hvilket ville give det samme resultat.USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table]FROM sys.objects WHERE type_desc ='USER_TABLE'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)) , 'TableHasPrimaryKey') =0ORDER BY [Skema], [Tabel]Resultat:
Ændrede databasekontekst til 'Test'.+-----+--------------------+| Skema | Tabel ||---------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatotimeoffsetTest || dbo | Individuel || dbo | Beskæftigelse || dbo | Hold || dbo | TimeTest |+-----------+---------------------+(7 rækker påvirket)