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