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 enCONSTRAINT_TYPE
afPRIMARY 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 enCONSTRAINT_TYPE
afPK
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 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 .