Можете да използвате OBJECTPROPERTY()
функция в SQL Server, за да провери дали дадена таблица е реферирана от външен ключ.
За да направите това, предайте идентификатора на обекта на таблицата като първи аргумент и TableHasForeignRef
като втори аргумент. Функцията връща 1
или 0
в зависимост от това дали е посочен от външен ключ или не.
Връщана стойност на 1
означава, че таблицата е посочен от външен ключ и стойност 0
означава, че не е.
Имайте предвид, че представените тук примери не изброяват външните ключове или техните таблици или нещо подобно. Те просто връщат стойност true/false, която можете да използвате, за да тествате дали дадена таблица е препраткана от външен ключ. Ако трябва да изброите всички външни ключове, които препращат към дадена таблица, вижте Връщане на всички външни ключове, които препращат към дадена таблица в SQL Server. Примерите в тази статия изброяват всеки външен ключ, както и таблицата/ите с външни ключове и таблицата с първичен ключ.
Пример 1 – Основна употреба
Ето един бърз пример за демонстрация.
USE WideWorldImportersDW; SELECT OBJECTPROPERTY(1141579105, 'TableHasForeignRef') AS [TableHasForeignRef];
Резултат:
+----------------------+ | TableHasForeignRef | |----------------------| | 1 | +----------------------+
В този случай WideWorldImportersDW базата данни има таблица с предоставения идентификатор и се препраща от външен ключ.
Пример 2 – Получаване на идентификатора на обекта
Ако знаете името на таблицата, но не и нейния идентификатор, можете да използвате OBJECT_ID()
функция за извличане на идентификатора въз основа на неговото име.
Пример:
SELECT OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasForeignRef') AS [TableHasForeignRef];
Резултат:
+----------------------+ | TableHasForeignRef | |----------------------| | 1 | +----------------------+
Това е същият обект от предишния пример.
Ето го отново с отделно извеждане на ID.
SELECT OBJECT_ID('Dimension.City') AS [Object ID], OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'TableHasForeignRef') AS [TableHasForeignRef];
Резултат:
+-------------+----------------------+ | Object ID | TableHasForeignRef | |-------------+----------------------| | 1013578649 | 1 | +-------------+----------------------+
Пример 3 – Когато таблицата НЕ се препраща от външен ключ
Ето какво се случва, когато таблицата не е посочена от външен ключ.
SELECT OBJECTPROPERTY(OBJECT_ID('Integration.Lineage'), 'TableHasForeignRef') AS [TableHasForeignRef];
Резултат:
+----------------------+ | TableHasForeignRef | |----------------------| | 0 | +----------------------+
В този случай обектът е таблица, просто не е препратен от външен ключ.
Пример 4 – Когато обектът не е таблица
Ето какво се случва, когато базата данни съдържа обект с идентификатор, но този обект не е таблица.
SELECT OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'TableHasForeignRef') AS [TableHasForeignRef];
Резултат:
+----------------------+ | TableHasForeignRef | |----------------------| | NULL | +----------------------+
Пример 5 – Обектът не съществува
SQL Server приема, че идентификаторът на обекта е в текущия контекст на базата данни. Ако подадете идентификатор на обект от друга база данни, или ще получите резултат NULL, или ще получите неправилни резултати.
SELECT OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'TableHasForeignRef') AS [InvalidObject], OBJECTPROPERTY(12345678, 'TableHasForeignRef') AS [12345678];
Резултат:
+-----------------+------------+ | InvalidObject | 12345678 | |-----------------+------------| | NULL | NULL | +-----------------+------------+
В този случай базата данни не съдържа обекти с това име или ID и така получавам резултат NULL.
Освен това ще получите NULL при грешка или ако нямате разрешение да видите обекта.