sql >> Databasteknik >  >> RDS >> Sqlserver

7 sätt att returnera alla tabeller med en primärnyckel i SQL Server

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 jag sys.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 en CONSTRAINT_TYPE av PRIMARY 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 en CONSTRAINT_TYPE av PK 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 som OBJECTPROPERTY() funktion, förutom att den stöder fler egenskaper. Därför kan något av de tidigare exemplen som använder OBJECTPROPERTY() , skulle lätt kunna skrivas om för att använda OBJECTPROPERTYEX() .

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, medan OBJECTPROPERTY() returnerar en int .


  1. MySQL High Availability Framework Explained – Del III:Failure Scenarios

  2. Fix:Åtkomst nekad för användaren 'root'@'localhost' i MariaDB

  3. Ny spårningsflagga för att fixa tabellvariabel prestanda

  4. Vad är SQLite?