sql >> Databáze >  >> RDS >> Sqlserver

7 způsobů, jak vrátit všechny tabulky s primárním klíčem na SQL Server

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 na sys.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 z PRIMARY 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 zobrazit CONSTRAINT_TYPE z PK 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ě jako OBJECTPROPERTY() 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ímco OBJECTPROPERTY() vrátí int .


  1. Seskupit podle měsíce a roku v MySQL

  2. Jak spustit nezpracovaný SQL v SQLAlchemy

  3. Jak mohu spustit PostgreSQL ve Windows?

  4. Výkonnostní překvapení a předpoklady:SET NOCOUNT ON