Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

7 начина за връщане на всички таблици с чужди ключове в SQL Server

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Добавете редуващ се цвят на ред към отчета за услугите за отчитане на SQL Server

  2. Вмъкване на List<> в таблицата на SQL Server

  3. Използване на sp_help_schedule в SQL Server

  4. Създайте база данни на SQL Server с SQLOPS

  5. Как можете да наименувате таблиците на набора от данни, които връщате в съхранена процедура?