Wie überprüfe ich, ob eine Datenbank in SQL Server vorhanden ist?

271

Was ist der ideale Weg, um mithilfe von TSQL zu überprüfen, ob eine Datenbank auf einem SQL Server vorhanden ist? Es scheint mehrere Ansätze zu geben, um dies umzusetzen.

Strahl
quelle

Antworten:

165

Aus einem Microsoft-Skript:

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
quelle
7
Dies kann aus einem Microsoft-Skript stammen, wird jedoch nicht von Microsoft empfohlen. Sie empfehlen, die Ansichten INFORMATION_SCHEMA zu verwenden, anstatt direkt auf die Systemtabellen zuzugreifen.
Mwigdahl
4
Warum wird empfohlen, INFORMATION_SCHEMA zu verwenden, anstatt direkt auf Tabellen zu verweisen?
eKek0
4
Im Allgemeinen liegt dies daran, dass Microsoft das Format INFORMATION_SCHEMA festschreibt und sich das Recht vorbehält, die Systemtabellen nach Belieben zu ändern. In diesem Fall funktioniert INFORMATION_SCHEMA nach genauerer Betrachtung jedoch nicht. Dies ist wahrscheinlich die beste Option.
Mwigdahl
3
Ich bin damit einverstanden, dass INFORMATION_SCHEMA für die Überprüfung von Objekten ~ in einer Datenbank bevorzugt wird. Aber kann INFORMATION_SCHEMA verwendet werden, um nach der Datenbank selbst zu suchen? <<<<< ............... CHECK_CONSTRAINTS Check Constraints COLUMN_DOMAIN_USAGE Jede Spalte mit einem benutzerdefinierten Datentyp. COLUMN_PRIVILEGES Jede Spalte mit einer Berechtigung, die dem aktuellen Benutzer in der aktuellen Datenbank gewährt wird. SPALTEN Listet jede Spalte im System auf. CONSTRAINT_COLUMN_USAGE Jede Spalte, für die eine Einschränkung definiert ist. CONSTRAINT_TABLE_USAGE Jede Tabelle, für die eine Einschränkung definiert ist.
GranadaCoder
2
@mwigdahl - Bitte geben Sie eine Referenz für diese behauptete empfohlene Praxis an.
Martin Smith
525

Eigentlich ist es am besten zu verwenden:

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

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

Eduardo
quelle
3
Nun, es ist sicherlich kürzer und kryptischer. Warum ist es aus Neugier besser?
Mike K
7
Vermutlich, weil db_id sicherer ist als die Suche nach einem Datenbanknamen an einem bestimmten Ort in[master]
Anthony
4
Nun ja, außerdem ist es fast unmöglich, dass db_id () schlechter ist (könnte die gleiche Komplexität / Kosten haben) als die akzeptierte Antwort, da db_id nach einer Zahl fragt. Ich wette also eher darauf, dass db_id () intelligenter implementiert wird, da dies von den Datenbankentwicklern durchgeführt wurde.
Eduardo
3
Wenn Sie Berechtigungsprobleme haben, z. B. wenn Sie keine Berechtigung zum Zugriff auf [master] haben, funktioniert dies gut!
Jason Foglia
2
@MadTigger: Sie sollten nicht [ ]in Ihren Anruf bei einbeziehen db_id; Das ist SQL-Syntax, nicht Teil des Datenbanknamens.
Jacob Krall
36
IF EXISTS (SELECT name FROM master.sys.databases WHERE name = N'YourDatabaseName')
  Do your thing...

Dies kam übrigens direkt von SQL Server Studio. Wenn Sie also Zugriff auf dieses Tool haben, empfehlen wir Ihnen, mit den verschiedenen verfügbaren "Script xxxx AS" -Funktionen zu spielen. Erleichtert Ihnen das Leben! :) :)

si618
quelle
3
Wenn 'USE [Master]' unpraktisch ist, können Sie die Ansichtsansicht aus jeder Datenbank direkt als 'master.sys.databases'
adressieren
8

Ich mag die Antwort von @ Eduardo und die akzeptierte Antwort. Ich mag es, einen Booleschen Wert von so etwas zurückzubekommen, also habe ich ihn für euch geschrieben.

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

Jetzt können Sie es so verwenden:

select [dbo].[DatabaseExists]('master') --returns 1
select [dbo].[DatabaseExists]('slave') --returns 0
Don Rolling
quelle
2

VERSUCHE DIES

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
quelle