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.objectssystemvisning.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_CONSTRAINTSvisning for at få en liste over tabeller med primærnøgler. Du skal filtrere resultaterne til kun de rækker, der har enCONSTRAINT_TYPEafPRIMARY 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_constraintsse enCONSTRAINT_TYPEafPKfor 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.objectssystemvisning 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
namekolonne 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 ligesomOBJECTPROPERTY()funktion, bortset fra at den understøtter flere egenskaber. Derfor kan ethvert af de tidligere eksempler, der brugerOBJECTPROPERTY(), kunne nemt omskrives til at brugeOBJECTPROPERTYEX().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, hvorimodOBJECTPROPERTY()returnerer en int .