Jak sprawdzić, czy baza danych istnieje w SQL Server?

271

Jaki jest idealny sposób sprawdzenia, czy baza danych istnieje na serwerze SQL przy użyciu TSQL? Wydaje się, że istnieje wiele podejść do wdrożenia tego.

Promień
źródło

Odpowiedzi:

165

Ze skryptu 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'
eKek0
źródło
7
Może to być skrypt Microsoft, ale nie jest to zalecana praktyka Microsoft. Zachęcają do korzystania z widoków INFORMACJE_SCHEMA zamiast bezpośredniego dostępu do tabel systemowych.
mwigdahl
4
dlaczego zachęca się do używania INFORMACJE_SCHEMA zamiast bezpośredniego odwoływania się do tabel?
eKek0
4
Zasadniczo dzieje się tak, ponieważ Microsoft zobowiązuje się do formatu INFORMACJE_SCHEMA i zastrzega sobie prawo do zmiany tabel systemowych według własnego uznania. Ale w tym przypadku, po dokładniejszym przyjrzeniu się, INFORMACJE_SCHEMA nie działa, więc jest to prawdopodobnie najlepsza opcja.
mwigdahl
3
Zgadzam się, że INFORMACJA_SCHEMA jest preferowana do sprawdzania obiektów ~ w bazie danych. Ale czy INFORMACJE_SCHEMA może być użyte do sprawdzenia samej bazy danych? <<<<< ............... CHECK_CONSTRAINTS Sprawdź ograniczenia COLUMN_DOMAIN_USAGE Każda kolumna, która ma typ danych zdefiniowany przez użytkownika. COLUMN_PRIVILEGES Każda kolumna z uprawnieniem przyznanym aktualnemu użytkownikowi lub przez niego w bieżącej bazie danych. COLUMNS Wyświetla każdą kolumnę w systemie CONSTRAINT_COLUMN_USAGE Każda kolumna, która ma zdefiniowane ograniczenie. CONSTRAINT_TABLE_USAGE Każda tabela, która ma zdefiniowane ograniczenie.
granadaCoder,
2
@mwigdahl - Podaj odniesienie do tej zalecanej zalecanej praktyki.
Martin Smith,
526

Właściwie najlepiej jest użyć:

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

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

Eduardo
źródło
3
Z pewnością jest krótszy i bardziej tajemniczy. Z ciekawości, dlaczego jest lepiej?
Mike K
7
Prawdopodobnie dlatego, że db_id jest bezpieczniejszy niż sprawdzanie nazwy bazy danych w określonej lokalizacji w[master]
Anthony
4
Cóż, tak, plus, że jest prawie niemożliwe, aby db_id () był gorszy (może mieć tę samą złożoność / koszt) niż zaakceptowana odpowiedź, ponieważ db_id pyta o liczbę. Raczej postawię na to, by db_id () był implementowany w mądrzejszy sposób, ponieważ zrobili to programiści baz danych.
Eduardo
3
Jeśli masz problemy z uprawnieniami, na przykład nie masz uprawnień dostępu do [master], działa to dobrze!
Jason Foglia,
2
@MadTigger: nie należy uwzględniać [ ]w swoim wezwaniu do db_id; taka jest składnia SQL, a nie część nazwy bazy danych.
Jacob Krall
36
IF EXISTS (SELECT name FROM master.sys.databases WHERE name = N'YourDatabaseName')
  Do your thing...

Nawiasem mówiąc, przyszedł bezpośrednio z SQL Server Studio, więc jeśli masz dostęp do tego narzędzia, zalecamy rozpoczęcie gry z różnymi dostępnymi funkcjami „Script xxxx AS”. Ułatwi ci życie! :)

si618
źródło
3
Jeśli „USE [Master]” jest niewygodny, możesz bezpośrednio adresować widok widoku z dowolnej bazy danych jako „master.sys.databases”
ProfK
8

Podoba mi się odpowiedź @ Eduardo i podobała mi się zaakceptowana odpowiedź. Lubię odzyskać boolean z czegoś takiego, więc napisałem to dla was.

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

Teraz możesz użyć tego w następujący sposób:

select [dbo].[DatabaseExists]('master') --returns 1
select [dbo].[DatabaseExists]('slave') --returns 0
Don Rolling
źródło
2

SPRÓBUJ TEGO

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
Kovid Purohit
źródło