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í nasys.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í jeFOREIGN KEY
. V tomto případě také používámDISTINCT
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 nasys.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žívalaOBJECTPROPERTYEX()
funkce. Tato funkce je v podstatě rozšířenímOBJECTPROPERTY()
a dělá všeOBJECTPROPERTY()
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ímcoOBJECTPROPERTYEX()
vrátí sql_variant typ.