Ако някога се наложи да намерите всички таблици, които имат първичен ключ в SQL Server, тази статия може да ви помогне.
Тази статия предлага седем начина за връщане на всички таблици в текущата база данни, които имат първичен ключ.
Обърнете внимание, че повечето от тези примери връщат само таблиците, а не самите първични ключове. Ако искате списък с първични ключове, вижте 11 начина за връщане на първичен ключ в SQL Server.
Опция 1 – OBJECTPROPERTY() със sys.tables
Първата опция включва използването на OBJECTPROPERTY()
функция при запитване на sys.tables
системен изглед. Тази функция приема TableHasPrimaryKey
аргумент. Ако този аргумент има стойност 1
, получаваме всички таблици, които имат първичен ключ (ако е 0
тогава получаваме всички таблици, които нямат първичен ключ).
ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], име КАТО [Таблица]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =1ORDER BY [Схема], [Таблица];
Резултат:
+---------+--------+| Схема | Таблица ||----------+--------|| dbo | Албуми || dbo | Художници || 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)),'TableHasPrimaryKey') =1 ANDTABLE_TYPELE',TABLE_TYPELE';Резултат:
+----------------+--------------+| TABLE_SCHEMA | ТАБЛИЦА_ИМЕ ||----------------+--------------|| dbo | Албуми || dbo | Художници || 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)), 'TableHasPrimaryKey ') =1 ПОРЪЧАЙ ПО [Схема], [Таблица]Резултат:
+---------+--------+| Схема | Таблица ||----------+--------|| dbo | Албуми || dbo | Художници || dbo | Държава || dbo | Жанрове |+----------+--------+Опция 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Можете да направите заявка за
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
преглед, за да получите списък с таблици с първични ключове. Трябва да филтрирате резултатите само до тези редове, които иматCONSTRAINT_TYPE
наPRIMARY KEY
.ИЗБЕРЕТЕ CONSTRAINT_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='PRIMARY KEY';Резултат:
+---------------------+--------------+| CONSTRAINT_SCHEMA | ТАБЛИЦА_ИМЕ ||---------------------+--------------|| dbo | Художници || dbo | Жанрове || dbo | Албуми || dbo | Държава |+---------------------+--------------+Този изглед също връща името на ограничението, така че можете да включите и тази колона, ако е необходимо:
ИЗБЕРЕТЕ CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='PRIMARY KEY';Резултат:
+---------------------+--------------+-------- ---------------------+| CONSTRAINT_SCHEMA | TABLE_NAME | CONSTRAINT_NAME ||---------------------+--------------+--------- ---------------------|| dbo | Художници | PK__Художници__25706B50FCD918B1 || dbo | Жанрове | PK__Жанрове__0385057E88BB96F8 || dbo | Албуми | PK__Албуми__97B4BE379FC780BD || dbo | Държава | PK__Country__10D1609F97ADEC31 |+---------------------+--------------+--------- ---------------------+Опция 5 – sys.key_constraints
Можете да филтрирате
sys.key_constraints
вижтеCONSTRAINT_TYPE
наPK
за да получите списък с таблици с първични ключове.ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], OBJECT_NAME(parent_object_id) КАТО [Таблица]FROM sys.key_constraints WHERE type ='PK';Резултат:
+---------+--------+| Схема | Таблица ||----------+--------|| dbo | Художници || dbo | Жанрове || dbo | Албуми || dbo | Държава |+---------+---------+Ето го отново с името на първичния ключ:
ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], OBJECT_NAME(parent_object_id) КАТО [Таблица], nameFROM sys.key_constraints WHERE type ='PK';Резултат:
+---------+--------+------------------------- ------+| Схема | Таблица | име ||----------+---------+------------------------------ -----|| dbo | Художници | PK__Художници__25706B50FCD918B1 || dbo | Жанрове | PK__Жанрове__0385057E88BB96F8 || dbo | Албуми | PK__Албуми__97B4BE379FC780BD || dbo | Държава | PK__Country__10D1609F97ADEC31 |+----------+---------+-------------------------- -----+Опция 6 – sys.objects
sys.objects
Системният изглед е популярен за връщане на информация за обекти с обхват на схема, включително първични ключове.ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], OBJECT_NAME(parent_object_id) КАТО [Таблица]FROM sys.objects WHERE type ='PK';Резултат:
+---------+--------+| Схема | Таблица ||----------+--------|| dbo | Художници || dbo | Жанрове || dbo | Албуми || dbo | Държава |+---------+---------+Както при предишните два примера, можем да включим
name
колона на този изглед, за да се покаже името на първичния ключ:ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], OBJECT_NAME(parent_object_id) КАТО [Таблица], nameFROM sys.objects WHERE type ='PK';Резултат:
+---------+--------+------------------------- ------+| Схема | Таблица | име ||----------+---------+------------------------------ -----|| dbo | Художници | PK__Художници__25706B50FCD918B1 || dbo | Жанрове | PK__Жанрове__0385057E88BB96F8 || dbo | Албуми | PK__Албуми__97B4BE379FC780BD || dbo | Държава | PK__Country__10D1609F97ADEC31 |+----------+---------+-------------------------- -----+Опция 7 – OBJECTPROPERTYEX()
OBJECTPROPERTYEX()
функцията работи точно катоOBJECTPROPERTY()
функция, с изключение на това, че поддържа повече свойства. Следователно, всеки от предишните примери, които използватOBJECTPROPERTY()
, може лесно да бъде пренаписан за използване наOBJECTPROPERTYEX()
.Например, мога да пренапиша първия пример на тази страница на следното:
ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], име КАТО [Таблица]FROM sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasPrimaryKey') =1ORDER BY [Схема], [Таблица];Резултат:
+---------+--------+| Схема | Таблица ||----------+--------|| dbo | Албуми || dbo | Художници || dbo | Държава || dbo | Жанрове |+----------+--------+Трябва да спомена, че
OBJECTPROPERTYEX()
връща sql_variant тип данни, докатоOBJECTPROPERTY()
връща int .