Тази статия предлага седем начина за връщане на всички таблици, които имат външни ключове в база данни в 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 тип.