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

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

Ако някога се наложи да разберете дали дадена база данни има таблици, които нямат първичен ключ, можете да изпълните някой от следните скриптове в SQL Server, за да върнете само тези таблици.

Всички тези скриптове се възползват от OBJECTPROPERTY() функция. Тази функция приема TableHasPrimaryKey аргумент, който можете да проверите за стойност от 0 . Ако е 0 , таблицата няма първичен ключ. Ако е 1 го прави. Следователно, можете също да използвате тази функция, за да върнете всички таблици с първичен ключ.

Тези скриптове просто връщат името на таблицата и нейната схема, но винаги можете да ги модифицирате, за да връщат повече колони.

Опция 1 – OBJECTPROPERTY() със sys.tables

sys.tables системният изглед е може би най-очевидното място за начало. Този изглед връща ред за всяка потребителска таблица и когато използваме OBJECTPROPERTY() за филтриране на резултатите въз основа на TableHasPrimaryKey свойството е 0 , получаваме само тези таблици без първичен ключ.

ИЗПОЛЗВАЙТЕ тест;ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], име КАТО [Таблица]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Схема], [Таблица];

Резултат:

Променен контекстът на базата данни на 'Test'.+----------+--------------------+| Схема | Таблица ||----------+--------------------|| dbo | Дата и време2 Тест || dbo | Дата и час2 Тест2 || dbo | DatetimeoffsetTest || dbo | Индивидуално || dbo | Професия || dbo | Екип || dbo | TimeTest |+----------+--------------------+(7 реда засегнати)

В този случай текущата ми база данни е тестова база данни с куп таблици без първични ключове.

Ако стартирам същото изявление в друга база данни, нямам резултати:

ИЗПОЛЗВАЙТЕ музика;ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], име КАТО [Таблица]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Схема], [Таблица];

Резултат:

Променен контекстът на базата данни на „Музика“.(0 засегнати реда)

Опция 2 – OBJECTPROPERTY() с INFORMATION_SCHEMA.TABLES

Този пример е подобен на предишния, с изключение на това, че този път питам за INFORMATION_SCHEMA.TABLES изглед. Изгледите на информационна схема, включени в SQL Server, отговарят на стандартната дефиниция на ISO за INFORMATION_SCHEMA.

ИЗПОЛЗВАЙТЕ тест;ИЗБЕРЕТЕ TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') =0 TBY,TABLENAME_TYPE;'TABLENAME_TBY,'ORDBLENAME> 

Резултат:

Променен контекстът на базата данни на 'Test'.+----------------+--------------------+ | TABLE_SCHEMA | ТАБЛИЦА_ИМЕ ||----------------+-------------------|| dbo | Дата и време2 Тест || dbo | Дата и час2 Тест2 || dbo | DatetimeoffsetTest || dbo | Индивидуално || dbo | Професия || dbo | Екип || dbo | TimeTest |+----------------+-------------------+(7 реда засегнати)

Опция 3 – OBJECTPROPERTY() със sys.objects

В този пример правя заявка за sys.objects изглед. Това е по-общ изглед в сравнение с предишните два и връща информация за обекти с обхват на схема (не само таблици). Поради това трябва да филтрираме резултатите с помощта на type = 'U' . U тук означава дефинирана от потребителя таблица.

Отново можем да използваме OBJECTPROPERTY() функция за филтриране на резултатите само до тези таблици, които нямат първичен ключ.

ИЗПОЛЗВАЙТЕ тест;ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], име КАТО [Таблица]FROM sys.objects WHERE type ='U'И OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name))) , 'TableHasPrimaryKey') =0ПОРЪЧАЙ ПО [Схема], [Таблица]

Резултат:

Променен контекстът на базата данни на 'Test'.+----------+--------------------+| Схема | Таблица ||----------+--------------------|| dbo | Дата и време2 Тест || dbo | Дата и час2 Тест2 || dbo | DatetimeoffsetTest || dbo | Индивидуално || dbo | Професия || dbo | Екип || dbo | TimeTest |+----------+--------------------+(7 реда засегнати)

Алтернативно бихме могли да го филтрираме чрез type_desc = 'USER_TABLE' , което би довело до същия резултат.

ИЗПОЛЗВАЙТЕ тест;ИЗБЕРЕТЕ SCHEMA_NAME(schema_id) КАТО [Схема], име КАТО [Таблица]FROM sys.objects WHERE type_desc ='USER_TABLE'И OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', име))) , 'TableHasPrimaryKey') =0ПОРЪЧАЙ ПО [Схема], [Таблица]

Резултат:

Променен контекстът на базата данни на 'Test'.+----------+--------------------+| Схема | Таблица ||----------+--------------------|| dbo | Дата и време2 Тест || dbo | Дата и час2 Тест2 || dbo | DatetimeoffsetTest || dbo | Индивидуално || dbo | Професия || dbo | Екип || dbo | TimeTest |+----------+--------------------+(7 засегнати реда)

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

  2. Как да изпълните тригер само когато се актуализира конкретна колона (SQL сървър)

  3. 5 трика за осигуряване на максимална производителност на SQL Server

  4. MVC4:UserIsInRole - Не може да се свърже с база данни на SQL Server

  5. Как да импортирате JSON файл в таблица на SQL Server