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

6 начина да проверите дали таблица съществува в SQL Server (примери за T-SQL)

Тази статия предлага пет опции за проверка дали таблица съществува в 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо и кога трябва да използвам SPARSE COLUMN? (SQL SERVER 2008)

  2. Одит на данни в NHibernate и SqlServer

  3. Влизания в SQL сървър между домейни с помощта на удостоверяване на Windows

  4. Изследване на форматите за дата на Postgres и техните различни функции

  5. Примери за преобразуване на „дата“ в „дата и час“ в SQL Server (T-SQL)