Om du någonsin behöver hitta alla tabeller som har en primärnyckel i SQL Server kan den här artikeln hjälpa dig.
Den här artikeln erbjuder sju sätt att returnera alla tabeller i den aktuella databasen som har en primärnyckel.
Observera att de flesta av dessa exempel endast returnerar tabellerna – inte själva primärnycklarna. Om du vill ha en lista över primärnycklar, se 11 sätt att returnera en primärnyckel i SQL Server.
Alternativ 1 – OBJECTPROPERTY() med sys.tables
Det första alternativet innebär att du använder OBJECTPROPERTY()
funktion när du frågar sys.tables
systemvy. Denna funktion accepterar en TableHasPrimaryKey
argument. Om detta argument har värdet 1
, får vi alla tabeller som har en primärnyckel (om den är 0
då får vi alla tabeller som inte har en primärnyckel).
VÄLJ SCHEMA_NAME(schema_id) SOM [Schema], namn SOM [Table]FRÅN sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =1ORDER BY [Schema], [Table];
Resultat:
+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Konstnärer || dbo | Land || dbo | Genrer |+----------+---------+
I det här exemplet har den aktuella databasen fyra tabeller med en primärnyckel.
De återstående exemplen kommer att fråga efter samma databas, så resultaten blir desamma för dessa frågor.
Alternativ 2 – OBJECTPROPERTY() med INFORMATION_SCHEMA.TABLES
Det här exemplet använder OBJECTPROPERTY()
igen, men den här gången frågar jag INFORMATION_SCHEMA.TABLES
visa.
VÄLJ TABLE_SCHEMA, TABLE_NAMEFrån INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') =1 ANDTABLE_TYPE='FÖRREJNANNAMN, TAB'>'FÖRETAGSNAMN, TAB'>'BAS-TABLE;Resultat:
+----------------+-------------+| TABLE_SCHEMA | TABLE_NAME ||----------------+-------------|| dbo | Album || dbo | Konstnärer || dbo | Land || dbo | Genrer |+----------------+--------------+Alternativ 3 – OBJECTPROPERTY() med sys.objects
Återigen
OBJECTPROPERTY()
kommer till undsättning. Den här gången frågar jagsys.objects
systemvy.VÄLJ SCHEMA_NAME(schema_id) AS [Schema], namn AS [Table]FRÅN sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasPrimaryKey ') =1ORDER EFTER [Schema], [Tabell]Resultat:
+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Konstnärer || dbo | Land || dbo | Genrer |+----------+---------+Alternativ 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Du kan fråga
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
visa för att få en lista över tabeller med primärnycklar. Du måste filtrera resultaten till endast de rader som har enCONSTRAINT_TYPE
avPRIMARY KEY
.VÄLJ CONSTRAINT_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='PRIMÄRNYCKEL';Resultat:
+----------------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+-------------------|| dbo | Konstnärer || dbo | Genrer || dbo | Album || dbo | Land |+----------------------+--------------+Den här vyn returnerar också begränsningsnamnet, så du kan även inkludera den kolumnen om det behövs:
VÄLJ CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='PRIMÄRNYCKEL';Resultat:
+---------------------+--------------+-------- ----------------------------+| CONSTRAINT_SCHEMA | TABLE_NAME | CONSTRAINT_NAME ||----------------------+--------------+-------- --------------------|| dbo | Konstnärer | PK__Artister__25706B50FCD918B1 || dbo | Genrer | PK__Genres__0385057E88BB96F8 || dbo | Album | PK__Album__97B4BE379FC780BD || dbo | Land | PK__Country__10D1609F97ADEC31 |+--------------------------+--------------+---------- ---------------------+Alternativ 5 – sys.key_constraints
Du kan filtrera
sys.key_constraints
visa enCONSTRAINT_TYPE
avPK
för att få en lista över tabeller med primärnycklar.VÄLJ SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table]FRÅN sys.key_constraints WHERE typ ='PK';Resultat:
+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Konstnärer || dbo | Genrer || dbo | Album || dbo | Land |+----------+---------+Här är den igen med primärnyckelns namn:
VÄLJ SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], nameFROM sys.key_constraints WHERE type ='PK';Resultat:
+----------+---------+------------------------ ------+| Schema | Tabell | namn ||--------+---------+-------------------------------- -----|| dbo | Konstnärer | PK__Artister__25706B50FCD918B1 || dbo | Genrer | PK__Genres__0385057E88BB96F8 || dbo | Album | PK__Album__97B4BE379FC780BD || dbo | Land | PK__Country__10D1609F97ADEC31 |+---------+--------+-------------------------------- -----+Alternativ 6 – sys.objects
sys.objects
systemvyn är populär för att returnera information om schemaomfattade objekt, inklusive primärnycklar.VÄLJ SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table]FROM sys.objects WHERE type ='PK';Resultat:
+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Konstnärer || dbo | Genrer || dbo | Album || dbo | Land |+----------+---------+Som med de två föregående exemplen kan vi inkludera
name
kolumn i denna vy för att visa namnet på primärnyckeln:VÄLJ SCHEMA_NAME(schema_id) AS [Schema], OBJECT_NAME(parent_object_id) AS [Table], nameFROM sys.objects WHERE type ='PK';Resultat:
+----------+---------+------------------------ ------+| Schema | Tabell | namn ||--------+---------+-------------------------------- -----|| dbo | Konstnärer | PK__Artister__25706B50FCD918B1 || dbo | Genrer | PK__Genres__0385057E88BB96F8 || dbo | Album | PK__Album__97B4BE379FC780BD || dbo | Land | PK__Country__10D1609F97ADEC31 |+---------+--------+-------------------------------- -----+Alternativ 7 – OBJECTPROPERTYEX()
OBJECTPROPERTYEX()
funktionen fungerar precis somOBJECTPROPERTY()
funktion, förutom att den stöder fler egenskaper. Därför kan något av de tidigare exemplen som använderOBJECTPROPERTY()
, skulle lätt kunna skrivas om för att användaOBJECTPROPERTYEX()
.Till exempel skulle jag kunna skriva om det första exemplet på den här sidan till följande:
VÄLJ SCHEMA_NAME(schema_id) SOM [Schema], namn SOM [Table]FRÅN sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasPrimaryKey') =1ORDER BY [Schema], [Table];Resultat:
+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Konstnärer || dbo | Land || dbo | Genrer |+----------+---------+Jag bör nämna att
OBJECTPROPERTYEX()
returnerar en sql_variant datatyp, medanOBJECTPROPERTY()
returnerar en int .