Тази статия предлага пет опции за проверка дали таблица съществува в SQL Server. Повечето опции включват заявка за системен изглед, но една от опциите изпълнява системна съхранена процедура, а друга включва функция.
Включвам и някои прости IF
изявления, които могат да бъдат променени, за да отговарят на вашите обстоятелства.
Опция 1 – Изгледът на sys.tables
Тази опция прави заявки за sys.tables
изглед на системния каталог. Този изглед връща ред за всяка потребителска таблица. Следователно можете да го заявите, като използвате името на таблицата, за което проверявате.
Пример:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
Резултат:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Можете също да добавите името на схемата към нещата, за които проверявате. Ето как да модифицирате предишната заявка, за да включва името на схемата:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Резултат:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Имайте предвид, че sys.tables
view връща само идентификатора на схемата, така че трябваше да го предам на SCHEMA_NAME()
функция, за да получи името си. Като алтернатива можех да използвам идентификатора на схемата, ако знаех това.
Пример:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
Резултат:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Опция 2 – Съхранената процедура sp_tables
Следващата опция изпълнява sp_tables
съхранена процедура.
Ето колко кратък може да бъде кодът ви, когато използвате този метод:
sp_tables 'Artists'
Резултат:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Тази съхранена процедура обаче връща изгледи, както и таблици, така че е добра идея да я стесните само до таблици (освен ако не се интересувате и от връщане на изгледи). За да го стесните до само таблици, използвайте @table_type = "'TABLE'"
.
Докато сте на това, можете също да посочите собственика на таблицата и квалификатора на таблицата.
Пример:
EXEC sp_tables @table_name = 'Artists', @table_owner = 'dbo', @table_qualifier = 'Music', @table_type = "'TABLE'", @fUsePattern = 1;
Резултат:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Важно е да се отбележи, че @table_type
параметърът приема списък, разделен със запетая. Следователно, той е малко по-различен от другите параметри. @table_type
стойността трябва да бъде затворена в двойни кавички, а всеки елемент в единични кавички. В моя пример има само един елемент от списъка, но той все още трябва да бъде затворен както в двойни, така и в единични кавички.
Опция 3 – INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.TABLES
системен изглед връща един ред за всяка таблица или изглед в текущата база данни, за които текущият потребител има разрешения. Това е подобно на sys.tables
, но връща по-малко колони. Изгледите на информационна схема, включени в SQL Server, отговарят на стандартната дефиниция на ISO за INFORMATION_SCHEMA.
Ето пример за използването му, за да проверите дали таблица съществува в текущата база данни:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists';
Резултат:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Ето го отново, но този път уточнявам и схемата:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists' AND TABLE_SCHEMA = 'dbo';
Резултат:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Опция 4 – Функцията OBJECT_ID()
Можете също да използвате функция като OBJECT_ID()
за да видите дали връща стойност, различна от NULL.
Пример:
SELECT OBJECT_ID('Artists', 'U') AS Result;
Резултат:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
В този случай таблицата съществува. Имайте предвид, че използвах U
за да посочите типа на обекта (дефинирана от потребителя таблица).
Можете също да предоставите име от три части, за да включите базата данни и схемата:
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
Резултат:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Ако таблицата не съществува, ще получите NULL
:
SELECT OBJECT_ID('Oops!', 'U') AS Result;
Резултат:
+----------+ | Result | |----------| | NULL | +----------+
Вижте по-долу за пример за използване на това в IF
изявление.
Опция 5 – Изгледът sys.objects
Сякаш нито един от предишните примери няма да свърши работа, ето още един начин да проверите дали съществува таблица.
Този път питам sys.objects
изглед на системния каталог. Този изглед връща ред за всеки дефиниран от потребителя обект с обхват на схема в базата данни. Той не връща само таблици, връща всякакви обекти. Затова трябва да го ограничим само до таблици. В този случай се интересувам само от потребителски дефинирани таблици, така че мога да използвам type = 'U'
(U
е за „USER_TABLE“). Като алтернатива можете да използвате TYPE_DESC = 'USER_TABLE'
.
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
Резултат:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Ето го отново, но посочва схемата:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Резултат:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Опция 6 – Изгледът sys.sysobjects (ИЗБЯГВАНЕ)
Тази опция е посочена само за да мога да препоръчам да не я използвате. sys.sysobjects
изгледът е включен в SQL Server за обратна съвместимост и Microsoft препоръчва да избягвате да използвате този изглед в бъдеща работа.
Ако срещнете код, който използва този изглед, помислете дали да го модифицирате, за да използвате sys.objects
или друг системен изглед или съхранена процедура.
Във всеки случай, ето как може да изглежда предишният пример, ако използвате sys.sysobjects
вместо sys.objects
.
SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
Резултат:
+-----------+ | id | |-----------| | 885578193 | +-----------+
IF изявление 1
Ето един прост IF
оператор, който проверява съществуването на таблицата, след което отпечатва различно съобщение в зависимост от резултата. Този код може да бъде променен, за да отговаря на вашите специфични нужди.
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Резултат:
The table exists
И ето как изглежда, когато таблицата не съществува:
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Customer' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Резултат:
The table does not exist
IF изявление 2
Ето още един IF
изявление, което може да бъде променено, за да отговаря на вашите специфични нужди.
IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Резултат:
The table exists