sql >> Database >  >> RDS >> Sqlserver

3 manieren om alle tabellen te retourneren ZONDER een primaire sleutel in SQL Server

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 met type = 'U' . De U 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)

  1. AVG()-functie in PostgreSQL

  2. Nodejs express en belooft niet te doen wat ik verwacht

  3. pass integer array naar orakel procedure door c#

  4. SQL Server AlwaysOn-beschikbaarheidsgroepen:installatie en configuratie, deel 2