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

3 måder at returnere alle tabeller UDEN en primær nøgle i SQL Server

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 af type = '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)

  1. ALTER TABLE-sætningen var i konflikt med CHECK-begrænsningen i SQL Server - SQL Server / TSQL Selvstudium, del 89

  2. Skift separatoren til et komma i SQLite-forespørgselsresultater

  3. Sådan finder du navnet på en begrænsning i SQL Server

  4. Fix Msg 241 "Konvertering mislykkedes ved konvertering af dato og/eller tid fra tegnstreng" i SQL Server