Come verificare se esiste un database in SQL Server?


272

Qual è il modo ideale per verificare se esiste un database su un SQL Server utilizzando TSQL? Sembra che diversi approcci per implementare questo.

Risposte:


165

Da uno script di 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
Ciò può provenire da uno script Microsoft ma non è una pratica consigliata da Microsoft. Incoraggiano a utilizzare le viste INFORMATION_SCHEMA anziché accedere direttamente alle tabelle di sistema.
mwigdahl,

4
perché incoraggiare l'utilizzo di INFORMATION_SCHEMA anziché utilizzare direttamente i riferimenti alle tabelle?
eKek0

4
In generale, è perché Microsoft si impegna nel formato INFORMATION_SCHEMA e si riserva il diritto di modificare le tabelle di sistema come preferiscono. Ma in questo caso, dopo aver esaminato più da vicino, INFORMATION_SCHEMA non funziona, quindi questa è probabilmente l'opzione migliore.
mwigdahl,

3
Sono d'accordo che INFORMATION_SCHEMA è preferito per il controllo degli oggetti ~ all'interno di un database. Ma INFORMATION_SCHEMA può essere utilizzato per verificare il db stesso? <<<<< ............... CHECK_CONSTRAINTS Controlla vincoli COLUMN_DOMAIN_USAGE Ogni colonna che ha un tipo di dati definito dall'utente. COLUMN_PRIVILEGES Ogni colonna con un privilegio concesso all'utente corrente o nel database corrente. COLONNE Elenca tutte le colonne del sistema CONSTRAINT_COLUMN_USAGE Ogni colonna con un vincolo definito su di esso. CONSTRAINT_TABLE_USAGE Ogni tabella su cui è definito un vincolo.
granadaCoder

2
@mwigdahl - Fornisci un riferimento per questa pratica raccomandata dichiarata.
Martin Smith,

526

In realtà è meglio usare:

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

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


3
Beh, è ​​certamente più breve e più criptico. Per curiosità, perché è meglio?
Mike K,

7
Presumibilmente perché db_id è più sicuro rispetto alla ricerca di un nome di database in una posizione specifica in[master]
Anthony

4
Bene, sì, in più è quasi impossibile che db_id () sia peggiore (potrebbe essere la stessa complessità / costo) della risposta accettata poiché db_id richiede un numero. Quindi scommetto piuttosto che db_id () sia implementato in modo più intelligente, dato che è stato fatto dagli sviluppatori del database.
Eduardo,

3
Se hai problemi di autorizzazione, come se non avessi il permesso di accedere a [master], questo funziona bene!
Jason Foglia,

2
@MadTigger: non è necessario includere [ ]nella chiamata a db_id; questa è sintassi SQL, non fa parte del nome del database.
Jacob Krall,

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

A proposito, questo è venuto direttamente da SQL Server Studio, quindi se hai accesso a questo strumento, ti consiglio di iniziare a giocare con le varie funzioni "Script xxxx AS" disponibili. Ti semplifica la vita! :)


3
Se "USE [Master]" è scomodo, è possibile indirizzare direttamente la vista di visualizzazione da qualsiasi database come "database master.sys"
ProfK

8

Mi piace la risposta di @ Eduardo e mi è piaciuta la risposta accettata. Mi piace recuperare un booleano da qualcosa del genere, quindi l'ho scritto per voi ragazzi.

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

Ora puoi usarlo in questo modo:

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

2

PROVA QUESTO

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.