SQL Server'da bir veritabanı olup olmadığını nasıl kontrol edebilirim?


271

TSQL kullanarak bir SQL Server'da bir veritabanı olup olmadığını kontrol etmenin ideal yolu nedir? Bunu uygulamak için birden fazla yaklaşım gibi görünüyor.

Yanıtlar:


165

Bir Microsoft komut dosyasından:

DECLARE @dbname nvarchar(128)
SET @dbname = N'Senna'

IF (EXISTS (SELECT name 
FROM master.dbo.sysdatabases 
WHERE ('[' + name + ']' = @dbname 
OR name = @dbname)))

-- code mine :)
PRINT 'db exists'

7
Bu bir Microsoft komut dosyasından olabilir, ancak Microsoft tarafından önerilen uygulama değildir. Doğrudan sistem tablolarına erişmek yerine BİLGİ_SCHEMA görünümlerini kullanmayı teşvik ederler.
mwigdahl

4
neden doğrudan tablo referanslarını kullanmak yerine BİLGİ_SCHEMA'yı kullanmaya teşvik edersiniz?
eKek0

4
Genel olarak Microsoft, BİLGİ_SCHEMA biçimini taahhüt eder ve sistem tablolarını istedikleri gibi değiştirme hakkını saklı tutar. Ancak bu durumda, daha yakından baktıktan sonra, BİLGİ_SCHEMA işe yaramaz, bu yüzden bu muhtemelen en iyi seçenektir.
mwigdahl

3
Bir veritabanının içindeki nesneleri kontrol etmek için BİLGİ_SCHEMA'nın tercih edildiğini kabul ediyorum. Fakat BİLGİ_SCHEMA db'nin kendisini kontrol etmek için kullanılabilir mi? <<<<< ............... CHECK_CONSTRAINTS Sınırlamaları Kontrol Edin COLUMN_DOMAIN_USAGE Kullanıcı tanımlı veri türüne sahip her sütun. COLUMN_PRIVILEGES Geçerli veritabanındaki geçerli kullanıcıya veya geçerli kullanıcı tarafından verilen ayrıcalığa sahip her sütun. COLUMNS Sistemdeki her sütunu listeler CONSTRAINT_COLUMN_USAGE Üzerinde bir kısıtlaması olan her sütun. CONSTRAINT_TABLE_USAGE Üzerinde bir kısıtlaması olan her tablo.
granadaCoder

2
@mwigdahl - Lütfen bu iddia edilen önerilen uygulama için bir referans sağlayın.
Martin Smith

526

Aslında kullanmak en iyisidir:

IF DB_ID('dms') IS NOT NULL
   --code mine :)
   print 'db exists'

Bkz. Https://docs.microsoft.com/en-us/sql/t-sql/functions/db-id-transact-sql


3
Kesinlikle daha kısa ve daha şifreli. Meraktan, neden daha iyi?
Mike K

7
Muhtemelen db_id, belirli bir konumda bir veritabanı adı kontrol etmekten daha güvenli olduğu için[master]
Anthony

4
Peki, evet, artı bir sayı için db_id sorgularından bu yana kabul edilen cevaptan daha kötü (neredeyse aynı karmaşıklık / maliyet olabilir) db_id () olması neredeyse imkansız. Bu yüzden veritabanı geliştiricileri tarafından yapıldığı için db_id () daha akıllı bir şekilde uygulanıyor bahis.
Eduardo

3
İzin sorunlarınız varsa, [master] erişim iznine sahip değilseniz bu işe yarar!
Jason Foglia

2
@MadTigger: Eğer içermemelidir [ ]çağrınızda db_id; bu SQL sözdizimi, veritabanı adının bir parçası değil.
Jacob Krall

36
IF EXISTS (SELECT name FROM master.sys.databases WHERE name = N'YourDatabaseName')
  Do your thing...

Bu arada, bu doğrudan SQL Server Studio'dan geldi, bu nedenle bu araca erişiminiz varsa, mevcut çeşitli "Script xxxx AS" işlevleriyle oynamaya başlamanızı öneririm. Hayatınızı kolaylaştıracak! :)


3
'KULLANIMI [Usta]' sakıncalı ise, doğrudan 'master.sys.databases' gibi herhangi bir veritabanından görünüm görünümü ele alabilir
ProfK

8

@ Eduardo'nun cevabını beğendim ve kabul edilen cevabı beğendim. Böyle bir şeyden bir boolean geri dönmeyi seviyorum, bu yüzden sizler için yazdım.

CREATE FUNCTION dbo.DatabaseExists(@dbname nvarchar(128))
RETURNS bit
AS
BEGIN
    declare @result bit = 0 
    SELECT @result = CAST(
        CASE WHEN db_id(@dbname) is not null THEN 1 
        ELSE 0 
        END 
    AS BIT)
    return @result
END
GO

Şimdi şöyle kullanabilirsiniz:

select [dbo].[DatabaseExists]('master') --returns 1
select [dbo].[DatabaseExists]('slave') --returns 0

2

BUNU DENE

IF EXISTS 
   (
     SELECT name FROM master.dbo.sysdatabases 
    WHERE name = N'New_Database'
    )
BEGIN
    SELECT 'Database Name already Exist' AS Message
END
ELSE
BEGIN
    CREATE DATABASE [New_Database]
    SELECT 'New Database is Created'
END
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.