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.objectssystemvy.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_CONSTRAINTSvisa för att få en lista över tabeller med primärnycklar. Du måste filtrera resultaten till endast de rader som har enCONSTRAINT_TYPEavPRIMARY 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_constraintsvisa enCONSTRAINT_TYPEavPKfö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.objectssystemvyn ä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
namekolumn 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 .