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

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

Hvis du nogensinde har brug for at finde alle tabeller, der har en primær nøgle i SQL Server, kan denne artikel hjælpe.

Denne artikel tilbyder syv måder at returnere alle tabeller i den aktuelle database, der har en primær nøgle.

Bemærk, at de fleste af disse eksempler kun returnerer tabellerne - ikke selve de primære nøgler. Hvis du vil have en liste over primære nøgler, se 11 måder at returnere en primær nøgle i SQL Server.

Mulighed 1 – OBJECTPROPERTY() med sys.tables

Den første mulighed involverer at bruge OBJECTPROPERTY() funktion, når du forespørger sys.tables systemvisning. Denne funktion accepterer en TableHasPrimaryKey argument. Hvis dette argument har en værdi på 1 , får vi alle tabeller, der har en primær nøgle (hvis den er 0 så får vi alle tabeller, der ikke har en primær nøgle).

VÆLG SCHEMA_NAME(skema_id) SOM [Skema], navn SOM [Tabel]FRA sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =1ORDER BY [Skema], [Tabel];

Resultat:

+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere || dbo | Land || dbo | Genrer |+----------+---------+

I dette eksempel har den aktuelle database fire tabeller med en primær nøgle.

De resterende eksempler vil forespørge den samme database, så resultaterne vil være de samme for disse forespørgsler.

Mulighed 2 – OBJECTPROPERTY() med INFORMATION_SCHEMA.TABLES

Dette eksempel bruger OBJECTPROPERTY() igen, men denne gang forespørger jeg på INFORMATION_SCHEMA.TABLES se.

VÆLG TABLE_SCHEMA, TABLE_NAMEFRA INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') =1 ANDTABLE_TYPE='PRØVNAVN TABLE'>'BASE-TABLE, TABLE'>'BASE-TABLE;

Resultat:

+----------------+--------------+| TABLE_SCHEMA | TABLE_NAME ||----------------+--------------|| dbo | Albums || dbo | Kunstnere || dbo | Land || dbo | Genrer |+----------------+--------------+

Mulighed 3 – OBJECTPROPERTY() med sys.objects

Endnu en gang OBJECTPROPERTY() kommer til undsætning. Denne gang forespørger jeg på sys.objects systemvisning.

VÆLG SCHEMA_NAME(schema_id) AS [Skema], navn AS [Tabel]FRA sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasPrimaryKey ') =1 BESTIL EFTER [Skema], [Tabel]

Resultat:

+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere || dbo | Land || dbo | Genrer |+----------+---------+

Mulighed 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS

Du kan forespørge på INFORMATION_SCHEMA.TABLE_CONSTRAINTS visning for at få en liste over tabeller med primærnøgler. Du skal filtrere resultaterne til kun de rækker, der har en CONSTRAINT_TYPE af PRIMARY KEY .

VÆLG CONSTRAINT_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='PRIMÆR NØGLE';

Resultat:

+----------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+-------------------|| dbo | Kunstnere || dbo | Genrer || dbo | Albums || dbo | Land |+------------------------+--------------+

Denne visning returnerer også begrænsningsnavnet, så du kan også inkludere denne kolonne, hvis det kræves:

VÆLG CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='PRIMÆR NØGLE';

Resultat:

+----------------------+--------------+-------- ----------------------+| CONSTRAINT_SCHEMA | TABLE_NAME | CONSTRAINT_NAME ||----------------------+--------------+-------- --------------------|| dbo | Kunstnere | PK__Kunstner__25706B50FCD918B1 || dbo | Genrer | PK__Genrer__0385057E88BB96F8 || dbo | Albums | PK__Albums__97B4BE379FC780BD || dbo | Land | PK__Country__10D1609F97ADEC31 |+--------------------------+--------------+---------- ----------------------+

Mulighed 5 – sys.key_constraints

Du kan filtrere sys.key_constraints se en CONSTRAINT_TYPE af PK for at få en liste over tabeller med primærnøgler.

VÆLG SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Tabel]FRA sys.key_constraints WHERE type ='PK';

Resultat:

+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Kunstnere || dbo | Genrer || dbo | Albums || dbo | Land |+----------+---------+

Her er den igen med den primære nøglenavn:

VÆLG SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], nameFROM sys.key_constraints WHERE type ='PK';

Resultat:

+----------+---------+------------------------ ------+| Skema | Tabel | navn ||--------+---------+-------------------------------- -----|| dbo | Kunstnere | PK__Kunstner__25706B50FCD918B1 || dbo | Genrer | PK__Genrer__0385057E88BB96F8 || dbo | Albums | PK__Albums__97B4BE379FC780BD || dbo | Land | PK__Country__10D1609F97ADEC31 |+---------+--------+-------------------------------- -----+

Mulighed 6 – sys.objects

sys.objects systemvisning er populær til at returnere oplysninger om skema-omfattede objekter, inklusive primærnøgler.

VÆLG SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table]FROM sys.objects WHERE type ='PK';

Resultat:

+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Kunstnere || dbo | Genrer || dbo | Albums || dbo | Land |+----------+---------+

Som med de foregående to eksempler kan vi inkludere name kolonne i denne visning for at vise navnet på den primære nøgle:

VÆLG SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], nameFROM sys.objects WHERE type ='PK';

Resultat:

+----------+---------+------------------------ ------+| Skema | Tabel | navn ||--------+---------+-------------------------------- -----|| dbo | Kunstnere | PK__Kunstner__25706B50FCD918B1 || dbo | Genrer | PK__Genrer__0385057E88BB96F8 || dbo | Albums | PK__Albums__97B4BE379FC780BD || dbo | Land | PK__Country__10D1609F97ADEC31 |+---------+--------+-------------------------------- -----+

Mulighed 7 – OBJECTPROPERTYEX()

OBJECTPROPERTYEX() funktionen fungerer ligesom OBJECTPROPERTY() funktion, bortset fra at den understøtter flere egenskaber. Derfor kan ethvert af de tidligere eksempler, der bruger OBJECTPROPERTY() , kunne nemt omskrives til at bruge OBJECTPROPERTYEX() .

For eksempel kunne jeg omskrive det første eksempel på denne side til følgende:

VÆLG SCHEMA_NAME(skema_id) SOM [Skema], navn SOM [Tabel]FRA sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasPrimaryKey') =1ORDER BY [Skema], [Tabel];

Resultat:

+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere || dbo | Land || dbo | Genrer |+----------+---------+

Jeg bør nævne at OBJECTPROPERTYEX() returnerer en sql_variant datatype, hvorimod OBJECTPROPERTY() returnerer en int .


  1. Sådan rettes:JSON_VALUE Returnerer NULL med lange strenge (SQL-server)

  2. Nysgerrig problem med Oracle UNION og ORDER BY

  3. Den glemte opgaveoperatør =og det almindelige :=

  4. Indsæt flere poster i oracle