Pokud někdy zjistíte, že potřebujete najít všechny tabulky, které mají primární klíč v SQL Server, tento článek vám může pomoci.
Tento článek nabízí sedm způsobů, jak vrátit všechny tabulky v aktuální databázi, které mají primární klíč.
Všimněte si, že většina z těchto příkladů vrací pouze tabulky – nikoli samotné primární klíče. Pokud chcete seznam primárních klíčů, přečtěte si 11 způsobů, jak vrátit primární klíč na SQL Server.
Možnost 1 – OBJECTPROPERTY() se sys.tables
První možnost zahrnuje použití OBJECTPROPERTY()
funkce při dotazu na sys.tables
systémový pohled. Tato funkce přijímá TableHasPrimaryKey
argument. Pokud má tento argument hodnotu 1
, získáme všechny tabulky, které mají primární klíč (pokud je 0
pak získáme všechny tabulky, které nemají primární klíč).
SELECT SCHEMA_NAME(schema_id) JAKO [Schéma], název JAKO [Tabulka]FROM sys.tablesWHERE OBJECTPROPERTY(id_objektu, 'TableHasPrimaryKey') =1ORDER BY [Schéma], [Tabulka];
Výsledek:
+-----------+---------+| Schéma | Tabulka ||----------+---------|| dbo | Alba || dbo | Umělci || dbo | Země || dbo | Žánry |+----------+---------+
V tomto příkladu má aktuální databáze čtyři tabulky s primárním klíčem.
Zbývající příklady budou dotazovat stejnou databázi, takže výsledky budou pro tyto dotazy stejné.
Možnost 2 – OBJECTPROPERTY() s INFORMATION_SCHEMA.TABLES
Tento příklad používá OBJECTPROPERTY()
znovu, ale tentokrát se ptám na INFORMATION_SCHEMA.TABLES
zobrazit.
SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') =1 ANDTABLE_TYPE='ZÁKLADNÍ TABULE_CHETABLE,'OR>Výsledek:
+----------------+--------------+| TABLE_SCHÉMA | TABLE_NAME ||----------------+--------------|| dbo | Alba || dbo | Umělci || dbo | Země || dbo | Žánry |+----------------+--------------+Možnost 3 – OBJECTPROPERTY() se sys.objects
Ještě jednou
OBJECTPROPERTY()
přichází na pomoc. Tentokrát se ptám nasys.objects
systémový pohled.SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasPrimaryKey ') =1ORDER BY [Schéma], [Tabulka]Výsledek:
+-----------+---------+| Schéma | Tabulka ||----------+---------|| dbo | Alba || dbo | Umělci || dbo | Země || dbo | Žánry |+----------+---------+Možnost 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Můžete se dotázat na
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
zobrazení a získáte seznam tabulek s primárními klíči. Je třeba filtrovat výsledky pouze na ty řádky, které majíCONSTRAINT_TYPE
zPRIMARY KEY
.SELECT CONSTRAINT_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='PRIMARY KEY';Výsledek:
+---------------------+--------------+| CONSTRAINT_SCHÉMA | TABLE_NAME ||---------------------+--------------|| dbo | Umělci || dbo | Žánry || dbo | Alba || dbo | Země |+---------------------+--------------+Toto zobrazení také vrátí název omezení, takže v případě potřeby můžete zahrnout i tento sloupec:
SELECT CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='PRIMARY KEY';Výsledek:
+---------------------+--------------+--------- -----------------------+| CONSTRAINT_SCHÉMA | TABLE_NAME | CONSTRAINT_NAME ||---------------------+--------------+----------- ----------------------|| dbo | Umělci | PK__Artists__25706B50FCD918B1 || dbo | Žánry | PK__Genres__0385057E88BB96F8 || dbo | Alba | PK__Alba__97B4BE379FC780BD || dbo | Země | PK__Country__10D1609F97ADEC31 |+---------------------+--------------+----------- ---------------------+Možnost 5 – sys.key_constraints
Můžete filtrovat
sys.key_constraints
zobrazitCONSTRAINT_TYPE
zPK
získat seznam tabulek s primárními klíči.SELECT SCHEMA_NAME(schema_id) AS [Schéma], OBJECT_NAME(parent_object_id) AS [Table]FROM sys.key_constraints WHERE type ='PK';Výsledek:
+-----------+---------+| Schéma | Tabulka ||----------+---------|| dbo | Umělci || dbo | Žánry || dbo | Alba || dbo | Země |+----------+---------+Zde je to opět s názvem primárního klíče:
SELECT SCHEMA_NAME(schema_id) AS [Schéma], OBJECT_NAME (rodič_object_id) AS [Tabulka], nameFROM sys.key_constraints WHERE typ ='PK';Výsledek:
+----------+---------+------------------------- ------+| Schéma | Tabulka | jméno ||----------+---------+-------------------------- -----|| dbo | Umělci | PK__Artists__25706B50FCD918B1 || dbo | Žánry | PK__Genres__0385057E88BB96F8 || dbo | Alba | PK__Alba__97B4BE379FC780BD || dbo | Země | PK__Country__10D1609F97ADEC31 |+----------+---------+--------------------------- -----+Možnost 6 – sys.objects
Soubor
sys.objects
systémový pohled je populární pro vracení informací o objektech s rozsahem schématu, včetně primárních klíčů.SELECT SCHEMA_NAME(schema_id) AS [Schéma], OBJECT_NAME (nadřazený_object_id) AS [Tabulka]FROM sys.objects WHERE type ='PK';Výsledek:
+-----------+---------+| Schéma | Tabulka ||----------+---------|| dbo | Umělci || dbo | Žánry || dbo | Alba || dbo | Země |+----------+---------+Stejně jako v předchozích dvou příkladech můžeme zahrnout
name
sloupec tohoto zobrazení pro zobrazení názvu primárního klíče:SELECT SCHEMA_NAME(schema_id) AS [Schéma], OBJECT_NAME (rodič_object_id) AS [Tabulka], nameFROM sys.objects WHERE type ='PK';Výsledek:
+----------+---------+------------------------- ------+| Schéma | Tabulka | jméno ||----------+---------+-------------------------- -----|| dbo | Umělci | PK__Artists__25706B50FCD918B1 || dbo | Žánry | PK__Genres__0385057E88BB96F8 || dbo | Alba | PK__Alba__97B4BE379FC780BD || dbo | Země | PK__Country__10D1609F97ADEC31 |+----------+---------+--------------------------- -----+Možnost 7 – OBJECTPROPERTYEX()
OBJECTPROPERTYEX()
funkce funguje stejně jakoOBJECTPROPERTY()
funkce, kromě toho, že podporuje více vlastností. Proto jakýkoli z předchozích příkladů, které používajíOBJECTPROPERTY()
, lze snadno přepsat na použitíOBJECTPROPERTYEX()
.Například bych mohl přepsat první příklad na této stránce na následující:
SELECT SCHEMA_NAME(schema_id) JAKO [Schéma], název JAKO [Tabulka]FROM sys.tablesWHERE OBJECTPROPERTYEX(id_objektu, 'TableHasPrimaryKey') =1ORDER BY [Schéma], [Tabulka];Výsledek:
+----------+---------+| Schéma | Tabulka ||----------+---------|| dbo | Alba || dbo | Umělci || dbo | Země || dbo | Žánry |+----------+---------+Měl bych zmínit, že
OBJECTPROPERTYEX()
vrátí sql_variant datový typ, zatímcoOBJECTPROPERTY()
vrátí int .