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