SQL Server 2008'de Depolanan bir prosedür yazıyorum. Veritabanında bir tablo olup olmadığını kontrol etmem gerekiyor. Olmazsa, onu yaratmam gerekir.
Bunu nasıl yaparım?
CREATE TABLE IF NOT EXISTS ...
SQL Server 2008'de Depolanan bir prosedür yazıyorum. Veritabanında bir tablo olup olmadığını kontrol etmem gerekiyor. Olmazsa, onu yaratmam gerekir.
Bunu nasıl yaparım?
CREATE TABLE IF NOT EXISTS ...
Yanıtlar:
Bunun gibi bir şey
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'))
Sadece kontrast için, aşağıda gösterildiği gibi object_id işlevini kullanmayı seviyorum. Okuması biraz daha kolay ve sys.objects, sysobjects, sys.all_objects ve sys.tables hakkında endişelenmenize gerek yok. Temel biçim:
IF object_id('MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Tabii ki bu isimde herhangi bir nesne varsa bu "Mevcut" olarak gösterilecektir . Yalnızca tabloları kontrol etmek istiyorsanız şunlara ihtiyacınız vardır:
IF object_id('MyTable', 'U') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Geçici tablolar için de çalışır:
IF object_id('tempdb.dbo.#MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Aşağıdaki komut dosyası ile bir tablo ile örnek bir veritabanı oluşturalım:
CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))
Yaklaşım 1: INFORMATION_SCHEMA.TABLES görünümünü kullanma
Mevcut veritabanında tblTest Tablosu olup olmadığını kontrol etmek için aşağıdaki gibi bir sorgu yazabiliriz.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
Yukarıdaki sorgu, geçerli veritabanındaki tüm şemalarda tblTest tablosunun varlığını kontrol eder. Bunun yerine Tablonun belirli bir Şema ve Belirtilen Veritabanındaki varlığını kontrol etmek isterseniz yukarıdaki sorguyu aşağıdaki gibi yazabiliriz:
IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
Bu Yaklaşımın Artıları: INFORMATION_SCHEMA görünümleri farklı RDBMS sistemlerinde taşınabilir, bu nedenle farklı RDBMS'ye taşıma herhangi bir değişiklik gerektirmez.
Yaklaşım 2: OBJECT_ID () işlevini kullanma
OBJECT_ID()
Mevcut veritabanında bir tblTest Tablosu olup olmadığını kontrol etmek için aşağıdaki gibi işlevi kullanabiliriz .
IF OBJECT_ID(N'dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
Tablo Adı için Veritabanı Adı ve Şema Adı bölümlerinin belirtilmesi isteğe bağlıdır. Ancak Veritabanı Adı ve Şema Adının belirtilmesi, tüm şemalarda geçerli veritabanını kontrol etmek yerine, tablonun belirtilen veritabanında ve belirli bir şema içinde varlığını kontrol etme seçeneği sağlar. Aşağıdaki sorgu, mevcut veritabanı MASTER veritabanı olsa bile , veritabanındaki şemadaki tblTest
tablonun varlığını kontrol edebileceğimizi göstermektedir .dbo
Test
USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
Artıları: Hatırlaması kolay. OBJECT_ID()
İşlev hakkında belirtilmesi gereken bir diğer önemli nokta şudur: mevcut bağlantı bağlamında oluşturulan Geçici Tablonun varlığını kontrol etme seçeneği sunar. Diğer tüm Yaklaşımlar, yalnızca mevcut bağlantı bağlamı yerine tüm bağlantı bağlamında oluşturulan Geçici Tablonun varlığını kontrol eder. Aşağıdaki sorgu, OBJECT_ID()
işlevi kullanarak Geçici Tablonun varlığının nasıl kontrol edileceğini gösterir :
CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
GO
Yaklaşım 3: sys.Objects Katalog Görünümünü Kullanma
Sys.Objects
Aşağıda gösterildiği gibi Tablonun varlığını kontrol etmek için katalog görünümünü kullanabiliriz :
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.tblTest') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Yaklaşım 4: sys.Tables Katalog Görünümünü Kullanma
Sys.Tables
Aşağıda gösterildiği gibi Tablonun varlığını kontrol etmek için katalog görünümünü kullanabiliriz :
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'tblTest' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Sys.Tables
katalog görünümü, satırları katalog görünümünden devralır Sys.Objects
, Sys.objects
katalog görünümü, sys.Tables
türetilmiş görünüm olarak anılan temel görünüm olarak adlandırılır. Sys.Tables
satırları yalnızca Tablo nesneleri için döndürürken, Sys.Object
görünüm tablo nesneleri için satırları döndürmekten ayrı olarak, saklı yordam, görünümler vb.
Yaklaşım 5: sys.sysobjects Sistem tablosunu kullanmaktan kaçının
sys.sysobjects
Sistem Tablosunu doğrudan kullanmaktan kaçınmalıyız , ona doğrudan erişim Sql Sunucusunun gelecekteki bazı sürümlerinde kullanımdan kaldırılacaktır. [Microsoft BOL] [1] bağlantısına göre Microsoft, doğrudan sistem tablosu sys.objects/sys.tables
yerine katalog görünümlerinin kullanılmasını önermektedir sys.sysobjects
.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
Referans: 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
Veritabanında bir tablonun varlığını kontrol etmek için aşağıdaki ifadeyi deneyin:
If not exists (select name from sysobjects where name = 'tablename')
Tabloyu if bloğunun içinde oluşturabilirsiniz.
sysobjects
yalnızca eski kodu bozmamak için var olan bir uyumluluk görünümüdür. Önerim , yalnızca SQL Server 2008 örneklerini hedefleyen kod için sistem kataloğu görünümlerini (örn sys.objects
. sys.tables
) Ve information_schema.tables
taşınabilir olması gereken kod için bilgi şeması görünümlerini (örn. ) Kullanmak olacaktır. Farklı görünümler hakkında daha fazla bilgiyi burada bulabilirsiniz: SQL Server Sistem Kataloğunu Sorgulama
Yanılmıyorsam, bu işe yaramalı:
if not exists (Select 1 from tableName)
create table ...