Я пишу збережену процедуру в SQL Server 2008. Мені потрібно перевірити, чи існує таблиця в базі даних. Якщо цього немає, мені потрібно створити його.
Як це зробити?
CREATE TABLE IF NOT EXISTS ...
Я пишу збережену процедуру в SQL Server 2008. Мені потрібно перевірити, чи існує таблиця в базі даних. Якщо цього немає, мені потрібно створити його.
Як це зробити?
CREATE TABLE IF NOT EXISTS ...
Відповіді:
Щось на зразок цього
IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[YourTable](
....
....
....
)
END
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 vs. sysobjects vs. sys.all_objects vs. sys.tables. Основна форма:
IF object_id('MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Звичайно, це відображатиметься як "Присутні", якщо є який-небудь об'єкт, присутній з такою назвою. Якщо ви хочете перевірити лише таблиці, вам знадобиться:
IF object_id('MyTable', 'U') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Він також працює для тимчасових таблиць:
IF object_id('tempdb.dbo.#MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Створимо зразок бази даних із таблицею за наведеним нижче сценарієм:
CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))
Підхід 1: Використання подання INFORMATION_SCHEMA.TABLES
Ми можемо написати запит, як показано нижче, щоб перевірити, чи існує таблиця tblTest у поточній базі даних.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
Вищезазначений запит перевіряє наявність таблиці tblTest у всіх схемах поточної бази даних. Замість цього, якщо ви хочете перевірити існування Таблиці у визначеній схемі та зазначеній базі даних, ми можемо записати вищезазначений запит як нижче:
IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
Плюси цього підходу: представлення INFORMATION_SCHEMA переносяться в різних системах RDBMS, тому перенесення на різні RDBMS не потребує змін.
Підхід 2: Використання функції OBJECT_ID ()
Ми можемо використовувати OBJECT_ID()
функцію, як показано нижче, щоб перевірити, чи існує таблиця tblTest у поточній базі даних.
IF OBJECT_ID(N'dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
Вказання частини бази даних та назви схеми для назви таблиці необов’язково. Але вказівка імені бази даних та назви схеми надає можливість перевірити існування таблиці в зазначеній базі даних та в межах визначеної схеми, замість того, щоб перевіряти в поточній базі даних по всіх схемах. Нижче наведений запит показує, що, хоча поточна база даних є базовою базою MASTER, ми можемо перевірити наявність tblTest
таблиці в dbo
схемі в Test
базі даних.
USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
Плюси: легко запам’ятати. Ще один примітний момент, який слід згадати про OBJECT_ID()
функцію, це: вона надає можливість перевірити існування Тимчасової таблиці, яка створена в поточному контексті зв'язку. Усі інші підходи перевіряють існування тимчасової таблиці, створеної у всіх контекстах з'єднань, а не лише у поточному контексті з'єднання. Нижче запит показує, як перевірити існування Тимчасової таблиці за допомогою OBJECT_ID()
функції:
CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
GO
Підхід 3: Використання sys.Objects Catalogue View
Ми можемо використовувати подання Sys.Objects
каталогу, щоб перевірити наявність таблиці, як показано нижче:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.tblTest') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Підхід 4: Використання системного перегляду sys.Tables
Ми можемо використовувати подання Sys.Tables
каталогу, щоб перевірити наявність таблиці, як показано нижче:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'tblTest' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Sys.Tables
Перегляд каталогів успадковує рядки з подання Sys.Objects
каталогу, подання Sys.objects
каталогів позначається як базовий вид, де sys.Tables
це позначається як похідне подання. Sys.Tables
повертає рядки лише для об'єктів Table, тоді як Sys.Object
перегляд крім повернення рядків для об'єктів таблиці, він повертає рядки для об'єктів типу: збережена процедура, представлення даних тощо.
Підхід 5: Уникайте використання системної таблиці sys.sysobjects
Ми повинні уникати використання sys.sysobjects
системної таблиці безпосередньо, у деяких майбутніх версіях сервера Sql буде закритий прямий доступ до неї. Відповідно до посилання [Microsoft BOL] [1], Microsoft пропонує використовувати представлення каталогів sys.objects/sys.tables
замість sys.sysobjects
системної таблиці безпосередньо.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
Довідка: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'd020915'))
BEGIN
declare @result int
set @result=1
select @result as result
END
Declare @Username varchar(20)
Set @Username = 'Mike'
if not exists
(Select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'tblEmp')
Begin
Create table tblEmp (ID int primary key, Name varchar(50))
Print (@Username + ' Table created successfully')
End
Else
Begin
Print (@Username + ' : this Table Already exists in the database')
End
Спробуйте наступне твердження, щоб перевірити наявність таблиці в базі даних:
If not exists (select name from sysobjects where name = 'tablename')
Ви можете створити таблицю всередині блоку if.
sysobjects
це перегляд сумісності, який існує лише для того, щоб уникнути порушення старого коду. Моя пропозиція полягала б у використанні системних представлень каталогів (наприклад sys.objects
, sys.tables
) для коду, націленого лише на екземпляри SQL Server 2008, та представлення інформаційної схеми (наприклад information_schema.tables
) для коду, який повинен бути переносним. Ви можете знайти більше інформації про різні погляди тут: Запит на каталог системного сервера SQL
Якщо я не помиляюся, це має працювати:
if not exists (Select 1 from tableName)
create table ...