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

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

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте varchar в datetime в SQL Server

  2. Кой е най-бързият начин за групово вмъкване на много данни в SQL Server (C# клиент)

  3. База данни, която може да обработва>500 милиона реда

  4. Как да конвертирате низ в дата/час в SQL Server с помощта на CONVERT()

  5. Как да върнете само числови стойности в SQL Server