Я пишу хранимую процедуру в SQL Server 2008. Мне нужно проверить, существует ли таблица в базе данных. Если нет, то мне нужно его создать.
Как мне это сделать?
Я пишу хранимую процедуру в SQL Server 2008. Мне нужно проверить, существует ли таблица в базе данных. Если нет, то мне нужно его создать.
Как мне это сделать?
CREATE TABLE IF NOT EXISTS ...
Ответы:
Что-то вроде этого
источник
if (not exists (select object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
Для контраста мне нравится использовать функцию object_id, как показано ниже. Его немного легче читать, и вам не нужно беспокоиться о sys.objects против sysobjects против sys.all_objects против sys.tables. Базовая форма:
Конечно, это будет отображаться как «Присутствует», если присутствует какой-либо объект с таким именем. Если вы хотите проверить только таблицы, вам понадобятся:
Он также работает для временных таблиц:
источник
Давайте создадим образец базы данных с таблицей с помощью следующего скрипта:
Подход 1. Использование представления INFORMATION_SCHEMA.TABLES
Мы можем написать запрос, как показано ниже, чтобы проверить, существует ли таблица tblTest в текущей базе данных.
Вышеупомянутый запрос проверяет наличие таблицы tblTest во всех схемах в текущей базе данных. Вместо этого, если вы хотите проверить наличие таблицы в указанной схеме и указанной базе данных, мы можем написать вышеуказанный запрос, как показано ниже:
Плюсы этого подхода: представления INFORMATION_SCHEMA переносимы между разными системами СУБД, поэтому перенос на разные СУБД не требует никаких изменений.
Подход 2: использование функции OBJECT_ID ()
Мы можем использовать
OBJECT_ID()
функцию, как показано ниже, чтобы проверить, существует ли таблица tblTest в текущей базе данных.Указание частей имени базы данных и имени схемы для имени таблицы необязательно. Но указание имени базы данных и имени схемы дает возможность проверить существование таблицы в указанной базе данных и в указанной схеме, вместо проверки текущей базы данных по всем схемам. Приведенный ниже запрос показывает, что даже если текущая база данных является ГЛАВНОЙ базой данных, мы можем проверить наличие
tblTest
таблицы вdbo
схеме вTest
базе данных.Плюсы: легко запомнить. Еще один важный момент, который следует упомянуть о
OBJECT_ID()
функции: она предоставляет возможность проверить наличие временной таблицы, которая создается в текущем контексте соединения. Все другие подходы проверяют существование временной таблицы, созданной для всего контекста соединения, а не только для текущего контекста соединения. В запросе ниже показано, как проверить наличие временной таблицы с помощьюOBJECT_ID()
функции:Подход 3: Использование представления каталога sys.Objects
Мы можем использовать представление
Sys.Objects
каталога, чтобы проверить наличие таблицы, как показано ниже:Подход 4: Использование представления каталога sys.Tables
Мы можем использовать представление
Sys.Tables
каталога, чтобы проверить наличие таблицы, как показано ниже:Sys.Tables
Представление каталога наследует строки из представленияSys.Objects
каталога, представлениеSys.objects
каталога упоминается как базовое представление, аsys.Tables
как производное представление.Sys.Tables
вернет строки только для объектов таблицы, тогда какSys.Object
представление, помимо возврата строк для объектов таблицы, возвращает строки для таких объектов, как: хранимая процедура, представления и т. д.Подход 5: избегайте использования системной таблицы sys.sysobjects
Мы должны избегать
sys.sysobjects
прямого использования системной таблицы, прямой доступ к ней будет устаревшим в некоторых будущих версиях Sql Server. По ссылке [Microsoft BOL] [1] Microsoft предлагает напрямую использовать представления каталогаsys.objects/sys.tables
вместоsys.sysobjects
системной таблицы.Ссылка: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
источник
отредактированный
Вы можете заглянуть в sys.tables для проверки наличия желаемой таблицы:
источник
источник
источник
Попробуйте выполнить следующую инструкцию, чтобы проверить наличие таблицы в базе данных:
Вы можете создать таблицу внутри блока if.
источник
sysobjects
представление о совместимости, которое существует только для того, чтобы избежать нарушения старого кода. Я предлагаю использовать представления системного каталога (напримерsys.objects
,sys.tables
) для кода, который будет нацеливаться только на экземпляры SQL Server 2008, и представления информационной схемы (напримерinformation_schema.tables
) для кода, который должен быть переносимым. Дополнительную информацию о различных представлениях можно найти здесь: Запрос системного каталога SQL ServerЕсли я не ошибаюсь, это должно сработать:
источник