Тази статия предлага седем начина за връщане на всички таблици, които имат външни ключове в база данни в SQL Server.
Всяка таблица се връща само веднъж, независимо колко външни ключа може да има. Това е различно от връщането на всички външни ключове, заедно с техните таблици. Ако искате да направите това, вижте 11 начина за връщане на чужди ключове в SQL Server.
Всички примери тук правят заявки за една и съща база данни и следователно връщат същия резултат.
Опция 1 – OBJECTPROPERTY() със sys.tables
Първата опция е да използвате OBJECTPROPERTY()
функция при запитване на sys.tables
системен изглед.
Тази функция приема TableHasForeignKey
аргумент, който ще бъде или 1
или 0
(или NULL
). Ако е 1
, това означава, че таблицата има външен ключ. Стойност 0
означава, че няма никакви външни ключове. Следователно можем да използваме това в WHERE
клауза за връщане само на онези таблици, където TableHasForeignKey
е настроен на 1
.
ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], име КАТО [Таблица]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasForeignKey') =1ORDER BY [Схема], [Таблица];
Резултат:
+---------+--------+| Схема | Таблица ||----------+--------|| dbo | Албуми || dbo | Художници |+----------+--------+
Опция 2 – OBJECTPROPERTY() с INFORMATION_SCHEMA.TABLES
Този пример използва OBJECTPROPERTY()
при запитване на INFORMATION_SCHEMA.TABLES
системен изглед.
ИЗБЕРЕТЕ TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') =1 ANDTABLE_TYPELE' ANDTABLE_TYPELE';Резултат:
+----------------+--------------+| TABLE_SCHEMA | ТАБЛИЦА_ИМЕ ||----------------+--------------|| dbo | Албуми || dbo | Художници |+----------------+--------------+Опция 3 – OBJECTPROPERTY() със sys.objects
Ето още една опция, която използва
OBJECTPROPERTY()
. Този път го използвам, когато отправям заявка къмsys.objects
системен изглед.ИЗБЕРЕТЕ 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)), 'TableHasForeignKey). ') =1 ПОРЪЧАЙ ПО [Схема], [Таблица]Резултат:
+---------+--------+| Схема | Таблица ||----------+--------|| dbo | Албуми || dbo | Художници |+----------+--------+Опция 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS с DISTINCT
Ето пример, който прави заявки за
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
системен изглед, където типът на ограничението еFOREIGN KEY
. В този случай използвам иDISTINCT
клауза, за да се предотврати връщането на таблици повече от веднъж, когато имат повече от един външен ключ.ИЗБЕРЕТЕ DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME ОТ INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='ЧУЖД КЛЮЧ';Резултат:
+---------------------+--------------+| CONSTRAINT_SCHEMA | ТАБЛИЦА_ИМЕ ||---------------------+--------------|| dbo | Албуми || dbo | Художници |+---------------------+--------------+Ето какво се случва, ако премахна
DISTINCT
клауза:ИЗБЕРЕТЕ CONSTRAINT_SCHEMA, TABLE_NAME ОТ INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='ЧУЖЕН КЛЮЧ';Резултат:
+---------------------+--------------+| CONSTRAINT_SCHEMA | ТАБЛИЦА_ИМЕ ||---------------------+--------------|| dbo | Албуми || dbo | Албуми || dbo | Художници |+---------------------+--------------+В този случай
Albums
таблицата има два външни ключа и така получавам два реда за тази една таблица.Опция 5 – sys.foreign_keys с DISTINCT
Ето още един пример, който използва
DISTINCT
клауза, но този път питам заsys.foreign_keys
системен изглед.ИЗБЕРЕТЕ DISTINCT OBJECT_SCHEMA_NAME(fk.parent_object_id) КАТО [Схема], OBJECT_NAME(fk.parent_object_id) КАТО [Таблица]ОТ sys.foreign_keys КАТО fkORDER BY [Схема], [Таблица];Резултат:
+---------+--------+| Схема | Таблица ||----------+--------|| dbo | Албуми || dbo | Художници |+----------+--------+И ето го без
DISTINCT
клауза:ИЗБЕРЕТЕ OBJECT_SCHEMA_NAME(fk.parent_object_id) КАТО [Схема], OBJECT_NAME(fk.parent_object_id) КАТО [Таблица]ОТ sys.foreign_keys КАТО fkORDER BY [Схема], [Таблица];Резултат:
+---------+--------+| Схема | Таблица ||----------+--------|| dbo | Албуми || dbo | Албуми || dbo | Художници |+----------+--------+Опция 6 – sys.foreign_keys с GROUP BY
Този е подобен на предишния пример, тъй като отправя заявка към
sys.foreign_keys
системен изглед. Разликата е, че вместо да използватеDISTINCT
клауза, той използваGROUP BY
вместо това клауза.ИЗБЕРЕТЕ OBJECT_SCHEMA_NAME(fk.parent_object_id) КАТО [Схема], OBJECT_NAME(fk.parent_object_id) КАТО [Таблица]FROM sys.foreign_keys КАТО fkGROUP BY OBJECT_SCHEMA_NAME(fk.parent_object_NAME(fk.parent_object_id), Резултат:+---------+--------+| Схема | Таблица ||----------+--------|| dbo | Албуми || dbo | Художници |+----------+--------+Опция 7 – OBJECTPROPERTYEX()
Този пример може да се удвоява в сравнение с някои предишни примери, но все пак си струва да се спомене.
Всеки от предишните примери, които използват
OBJECTPROPERTY()
функция, може лесно да бъде пренаписан, за да се използваOBJECTPROPERTYEX()
функция. Тази функция е основно разширение къмOBJECTPROPERTY()
, и прави всичкоOBJECTPROPERTY()
прави и повече.Така че мога да пренапиша първия пример на тази страница със следното:
ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], име КАТО [Таблица]FROM sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasForeignKey') =1ORDER BY [Схема], [Таблица];Резултат:
+---------+--------+| Схема | Таблица ||----------+--------|| dbo | Албуми || dbo | Художници |+----------+--------+Една разлика, за която трябва да знаете, е, че тези две функции връщат различни типове връщане.
OBJECTPROPERTY()
връща int докатоOBJECTPROPERTYEX()
връща sql_variant тип.