Bagaimana cara memeriksa apakah ada database di SQL Server?


272

Apa cara ideal untuk memeriksa apakah ada database di SQL Server menggunakan TSQL? Tampaknya banyak pendekatan untuk mengimplementasikan ini.

Jawaban:


165

Dari skrip Microsoft:

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
Itu mungkin dari skrip Microsoft tetapi itu bukan praktik yang disarankan Microsoft. Mereka mendorong penggunaan tampilan INFORMATION_SCHEMA daripada langsung mengakses tabel sistem.
mwigdahl

4
mengapa dianjurkan menggunakan INFORMATION_SCHEMA daripada langsung menggunakan referensi ke tabel?
eKek0

4
Secara umum itu karena Microsoft berkomitmen pada format INFORMATION_SCHEMA, dan berhak mengubah tabel sistem sesuka mereka. Tetapi dalam kasus ini, setelah melihat lebih dekat, INFORMATION_SCHEMA tidak berfungsi, jadi ini mungkin pilihan terbaik.
mwigdahl

3
Saya setuju INFORMATION_SCHEMA lebih disukai untuk memeriksa objek ~ di dalam database. Tetapi bisakah INFORMATION_SCHEMA digunakan untuk memeriksa db itu sendiri? <<<<< ............... CHECK_CONSTRAINTS Periksa Kendala COLUMN_DOMAIN_USAGE Setiap kolom yang memiliki tipe data yang ditentukan pengguna. COLUMN_PRIVILEGES Setiap kolom dengan hak istimewa yang diberikan kepada atau oleh pengguna saat ini dalam database saat ini. COLUMNS Daftar setiap kolom dalam sistem CONSTRAINT_COLUMN_USAGE Setiap kolom yang memiliki batasan didefinisikan di atasnya. CONSTRAINT_TABLE_USAGE Setiap tabel yang memiliki batasan didefinisikan di atasnya.
granadaCoder

2
@mwigdahl - Berikan referensi untuk praktik yang disarankan yang diklaim ini.
Martin Smith

526

Sebenarnya yang terbaik untuk digunakan:

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

Lihat https://docs.microsoft.com/en-us/sql/t-sql/functions/db-id-transact-sql


3
Yah itu tentu saja lebih pendek dan lebih samar. Karena penasaran, mengapa lebih baik?
Mike K

7
Mungkin karena db_id lebih aman daripada memeriksa nama database di lokasi tertentu di[master]
Anthony

4
Yah, ya, ditambah bahwa hampir tidak mungkin untuk db_id () menjadi lebih buruk (bisa menjadi kompleksitas / biaya yang sama) daripada jawaban yang diterima karena db_id meminta nomor. Jadi saya lebih suka bertaruh pada db_id () diimplementasikan dengan cara yang lebih cerdas, karena itu dilakukan oleh pengembang basis data.
Eduardo

3
Jika Anda memiliki masalah izin, seperti Anda tidak memiliki izin untuk mengakses [master] ini berfungsi dengan baik!
Jason Foglia

2
@ MadTigger: Anda tidak harus memasukkan [ ]dalam panggilan Anda ke db_id; itu sintaks SQL, bukan bagian dari nama database.
Jacob Krall

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

Omong-omong, ini datang langsung dari SQL Server Studio, jadi jika Anda memiliki akses ke alat ini, saya sarankan Anda mulai bermain dengan berbagai fungsi "Script xxxx AS" yang tersedia. Akan membuat hidup Anda lebih mudah! :)


3
Jika 'USE [Master]' tidak nyaman, Anda dapat langsung mengatasi tampilan view dari database apa pun sebagai 'master.sys.databases'
ProfK

8

Saya suka jawaban @ Eduardo dan saya suka jawaban yang diterima. Saya suka mendapatkan kembali boolean dari sesuatu seperti ini, jadi saya menulisnya untuk kalian.

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

Sekarang Anda dapat menggunakannya seperti ini:

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

2

COBA INI

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.