Als u ooit wilt weten of een database tabellen bevat die geen primaire sleutel hebben, kunt u een van de volgende scripts in SQL Server uitvoeren om alleen die tabellen te retourneren.
Al deze scripts maken gebruik van de OBJECTPROPERTY()
functie. Deze functie accepteert een TableHasPrimaryKey
argument dat u kunt controleren op een waarde van 0
. Als het 0
. is , heeft de tabel geen primaire sleutel. Als het 1
is het doet. Daarom kunt u deze functie ook gebruiken om alle tabellen met . te retourneren een primaire sleutel.
Deze scripts retourneren eenvoudig de naam van de tabel en het bijbehorende schema, maar u kunt ze altijd wijzigen om meer kolommen te retourneren.
Optie 1 – OBJECTPROPERTY() met sys.tables
De sys.tables
systeemweergave is waarschijnlijk de meest voor de hand liggende plaats om te beginnen. Deze weergave retourneert een rij voor elke gebruikerstabel en wanneer we OBJECTPROPERTY()
gebruiken om de resultaten te filteren op basis van de TableHasPrimaryKey
eigenschap is 0
, we krijgen alleen die tabellen zonder een primaire sleutel.
GEBRUIK Test;SELECT SCHEMA_NAME(schema_id) AS [Schema], naam AS [Tabel]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Tabel];
Resultaat:
De databasecontext gewijzigd in 'Test'.+----------+--------------------+| Schema | Tabel ||----------+--------------------|| dbo | Datetime2Test || dbo | Datumtijd2Test2 || dbo | DatetimeoffsetTest || dbo | Individueel || dbo | beroep || dbo | Team || dbo | TimeTest |+----------+--------------------+(7 rijen aangetast)
In dit geval is mijn huidige database een testdatabase met een aantal tabellen zonder primaire sleutels.
Als ik hetzelfde statement op een andere database uitvoer, krijg ik geen resultaten:
MUZIEK GEBRUIKEN;SELECT SCHEMA_NAME(schema_id) AS [Schema], naam AS [Table]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Tabel];
Resultaat:
De databasecontext gewijzigd in 'Muziek'. (0 rijen beïnvloed)
Optie 2 – OBJECTPROPERTY() met INFORMATION_SCHEMA.TABLES
Dit voorbeeld is vergelijkbaar met het vorige, behalve dat ik deze keer de INFORMATION_SCHEMA.TABLES
opvraag. weergave. De weergaven van het informatieschema in SQL Server voldoen aan de ISO-standaarddefinitie voor INFORMATION_SCHEMA.
GEBRUIK Test;SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') =0 ANDTABLE_TYPE='BASISTABEL'SCHEMA; TABLE_NAME>Resultaat:
De databasecontext gewijzigd in 'Test'.+----------------+--------------------+ | TABLE_SCHEMA | TABLE_NAME ||----------------+--------------------|| dbo | Datetime2Test || dbo | Datumtijd2Test2 || dbo | DatetimeoffsetTest || dbo | Individueel || dbo | beroep || dbo | Team || dbo | TimeTest |+----------------+--------------------+(7 rijen aangetast)Optie 3 – OBJECTPROPERTY() met sys.objects
In dit voorbeeld vraag ik de
sys.objects
weergave. Dit is een meer algemene weergave in vergelijking met de vorige twee en geeft informatie over objecten met schemabereik (niet alleen tabellen). Daarom moeten we de resultaten filteren mettype = 'U'
. DeU
hier staat voor door de gebruiker gedefinieerde tabel.Nogmaals, we kunnen de
OBJECTPROPERTY()
. gebruiken functie om de resultaten te filteren naar alleen die tabellen die geen primaire sleutel hebben.GEBRUIK Test;SELECT SCHEMA_NAME(schema_id) AS [Schema], naam AS [Tabel]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', naam)) , 'TableHasPrimaryKey') =0ORDER BY [Schema], [Tabel]Resultaat:
De databasecontext gewijzigd in 'Test'.+----------+--------------------+| Schema | Tabel ||----------+--------------------|| dbo | Datetime2Test || dbo | Datumtijd2Test2 || dbo | DatetimeoffsetTest || dbo | Individueel || dbo | beroep || dbo | Team || dbo | TimeTest |+----------+--------------------+(7 rijen aangetast)We kunnen het ook filteren op
type_desc = 'USER_TABLE'
, wat hetzelfde resultaat zou opleveren.GEBRUIK Test;SELECT SCHEMA_NAME(schema_id) AS [Schema], naam AS [Tabel]FROM sys.objects WHERE type_desc ='USER_TABLE'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', naam)) , 'TableHasPrimaryKey') =0ORDER BY [Schema], [Tabel]Resultaat:
De databasecontext gewijzigd in 'Test'.+----------+--------------------+| Schema | Tabel ||----------+--------------------|| dbo | Datetime2Test || dbo | Datumtijd2Test2 || dbo | DatetimeoffsetTest || dbo | Individueel || dbo | beroep || dbo | Team || dbo | TimeTest |+----------+--------------------+(7 rijen aangetast)