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

7 způsobů, jak vrátit všechny tabulky s cizími klíči na SQL Server

Tento článek nabízí sedm způsobů, jak vrátit všechny tabulky, které mají cizí klíče v databázi na serveru SQL.

Každá tabulka je vrácena pouze jednou, bez ohledu na to, kolik cizích klíčů může mít. To se liší od vracení všech cizích klíčů spolu s jejich tabulkami. Pokud to chcete udělat, přečtěte si 11 způsobů, jak vrátit cizí klíče na SQL Server.

Všechny příklady zde dotazují stejnou databázi, a proto vracejí stejný výsledek.

Možnost 1 – OBJECTPROPERTY() se sys.tables

První možností je použít OBJECTPROPERTY() funkce při dotazu na sys.tables systémový pohled.

Tato funkce přijímá TableHasForeignKey argument, který bude buď 1 nebo 0 (nebo NULL ). Pokud je to 1 , to znamená, že tabulka má cizí klíč. Hodnota 0 znamená, že nemá žádné cizí klíče. Proto to můžeme použít v WHERE klauzule vrátit pouze ty tabulky, kde je TableHasForeignKey je nastaven na 1 .

SELECT SCHEMA_NAME(schema_id) JAKO [Schéma], název JAKO [Tabulka]FROM sys.tablesWHERE OBJECTPROPERTY(id_objektu, 'TableHasForeignKey') =1ORDER BY [Schéma], [Tabulka];

Výsledek:

+-----------+---------+| Schéma | Tabulka ||----------+---------|| dbo | Alba || dbo | Umělci |+----------+---------+

Možnost 2 – OBJECTPROPERTY() s INFORMATION_SCHEMA.TABLES

Tento příklad používá OBJECTPROPERTY() při dotazu na INFORMATION_SCHEMA.TABLES systémový pohled.

SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') =1 ANDTABLE_TYPE='ZÁKLADNÍ TABULE_CHETABLE,'OR> 

Výsledek:

+----------------+--------------+| TABLE_SCHÉMA | TABLE_NAME ||----------------+--------------|| dbo | Alba || dbo | Umělci |+----------------+--------------+

Možnost 3 – OBJECTPROPERTY() se sys.objects

Zde je další možnost, která používá OBJECTPROPERTY() . Tentokrát jej používám při dotazování na sys.objects systémový pohled.

SELECT SCHEMA_NAME(schema_id) JAKO [Schéma], název JAKO [Tabulka]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(id_schema), '.', název)), 'TableHasForeignKey ') =1ORDER BY [Schéma], [Tabulka]

Výsledek:

+-----------+---------+| Schéma | Tabulka ||----------+---------|| dbo | Alba || dbo | Umělci |+----------+---------+

Možnost 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS s DISTINCT

Zde je příklad, který se dotazuje na INFORMATION_SCHEMA.TABLE_CONSTRAINTS systémový pohled, kde typ omezení je FOREIGN KEY . V tomto případě také používám DISTINCT klauzule, aby se zabránilo vracení tabulek více než jednou, když mají více než jeden cizí klíč.

SELECT DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='CIZI KLÍČ';

Výsledek:

+---------------------+--------------+| CONSTRAINT_SCHÉMA | TABLE_NAME ||---------------------+--------------|| dbo | Alba || dbo | Umělci |+---------------------+--------------+

Zde je to, co se stane, když odstraním DISTINCT klauzule:

SELECT CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='CIZI KLÍČ';

Výsledek:

+---------------------+--------------+| CONSTRAINT_SCHÉMA | TABLE_NAME ||---------------------+--------------|| dbo | Alba || dbo | Alba || dbo | Umělci |+---------------------+--------------+

V tomto případě Albums tabulka má dva cizí klíče, takže pro jednu tabulku dostanu dva řádky.

Možnost 5 – sys.foreign_keys s DISTINCT

Zde je další příklad, který používá DISTINCT klauzule, ale tentokrát se ptám na sys.foreign_keys systémový pohled.

VYBERTE DISTINCT OBJECT_SCHEMA_NAME(fk.parent_object_id) JAKO [Schéma], OBJECT_NAME(fk.parent_object_id) JAKO [Tabulka]OD sys.foreign_keys JAKO fkORDER PODLE [Schéma], [Tabulka];

Výsledek:

+-----------+---------+| Schéma | Tabulka ||----------+---------|| dbo | Alba || dbo | Umělci |+----------+---------+

A tady je to bez DISTINCT klauzule:

VYBERTE OBJECT_SCHEMA_NAME(fk.parent_object_id) JAKO [Schéma], OBJECT_NAME(fk.parent_object_id) JAKO [Tabulka]Z sys.foreign_keys JAKO fkORDER PODLE [Schéma], [Tabulka];

Výsledek:

+-----------+---------+| Schéma | Tabulka ||----------+---------|| dbo | Alba || dbo | Alba || dbo | Umělci |+----------+---------+

Možnost 6 – sys.foreign_keys s GROUP BY

Tento příklad je podobný předchozímu příkladu v tom, že se dotazuje na sys.foreign_keys systémový pohled. Rozdíl je v tom, že namísto použití DISTINCT klauzule, používá GROUP BY místo toho klauzule.

VYBERTE OBJECT_SCHEMA_NAME(fk.parent_object_id) JAKO [Schéma], OBJECT_NAME(fk.parent_object_id) JAKO [Tabulka]FROM sys.foreign_keys AS fkGROUP BY OBJECT_SCHEMA_NAME(fk.parent_object_id.fkpar>) 

Výsledek:

+-----------+---------+| Schéma | Tabulka ||----------+---------|| dbo | Alba || dbo | Umělci |+----------+---------+

Možnost 7 – OBJECTPROPERTYEX()

Tento příklad se může oproti některým předchozím příkladům zdvojnásobit, ale přesto stojí za zmínku.

Jakýkoli z předchozích příkladů, které používají OBJECTPROPERTY() funkci, lze snadno přepsat tak, aby používala OBJECTPROPERTYEX() funkce. Tato funkce je v podstatě rozšířením OBJECTPROPERTY() a dělá vše OBJECTPROPERTY() dělá a další.

Takže bych mohl přepsat první příklad na této stránce takto:

SELECT SCHEMA_NAME(schema_id) JAKO [Schéma], název JAKO [Tabulka]FROM sys.tablesWHERE OBJECTPROPERTYEX(id_objektu, 'TableHasForeignKey') =1ORDER BY [Schéma], [Tabulka];

Výsledek:

+-----------+---------+| Schéma | Tabulka ||----------+---------|| dbo | Alba || dbo | Umělci |+----------+---------+

Jeden rozdíl, o kterém byste měli vědět, je ten, že tyto dvě funkce vracejí různé návratové typy. OBJECTPROPERTY() vrátí int zatímco OBJECTPROPERTYEX() vrátí sql_variant typ.


  1. Zkrácení tabulky v uložené proceduře

  2. Časový limit pro metodu OracleDataReader.Read

  3. Jak Coalesce() funguje v SQLite

  4. Nastavení NLS_NUMERIC_CHARACTERS pro desetinné místo