Comment vérifier si une base de données existe dans SQL Server?

272

Quelle est la façon idéale de vérifier si une base de données existe sur un serveur SQL utilisant TSQL? Il semble que plusieurs approches soient mises en œuvre.

Rayon
la source

Réponses:

165

À partir d'un script 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
la source
7
Cela peut provenir d'un script Microsoft, mais ce n'est pas la pratique recommandée par Microsoft. Ils encouragent l'utilisation des vues INFORMATION_SCHEMA plutôt que d'accéder directement aux tables système.
mwigdahl
4
pourquoi encourager l'utilisation de INFORMATION_SCHEMA au lieu d'utiliser directement les références aux tables?
eKek0
4
En général, c'est parce que Microsoft s'engage au format INFORMATION_SCHEMA et se réserve le droit de modifier les tables système à sa guise. Mais dans ce cas, après avoir regardé de plus près, INFORMATION_SCHEMA ne fonctionne pas, c'est donc probablement la meilleure option.
mwigdahl
3
J'accepte que INFORMATION_SCHEMA soit préféré pour vérifier les objets ~ dans une base de données. Mais INFORMATION_SCHEMA peut-il être utilisé pour vérifier la base de données elle-même? <<<<< ............... CHECK_CONSTRAINTS Vérifier les contraintes COLUMN_DOMAIN_USAGE Chaque colonne qui a un type de données défini par l'utilisateur. COLUMN_PRIVILEGES Chaque colonne avec un privilège accordé à ou par l'utilisateur actuel dans la base de données actuelle. COLUMNS Répertorie toutes les colonnes du système CONSTRAINT_COLUMN_USAGE Chaque colonne qui a une contrainte définie dessus. CONSTRAINT_TABLE_USAGE Chaque table qui a une contrainte définie dessus.
granadaCoder
2
@mwigdahl - Veuillez fournir une référence pour cette pratique recommandée.
Martin Smith
526

En fait, il est préférable d'utiliser:

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

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

Eduardo
la source
3
Eh bien, c'est certainement plus court et plus cryptique. Par curiosité, pourquoi est-ce mieux?
Mike K
7
Vraisemblablement parce que db_id est plus sûr que de rechercher un nom de base de données dans un emplacement spécifique dans[master]
Anthony
4
Eh bien, oui, en plus qu'il est presque impossible que db_id () soit pire (pourrait être la même complexité / coût) que la réponse acceptée car db_id demande un nombre. Je parie donc plutôt que db_id () soit implémenté de manière plus intelligente, car cela a été fait par les développeurs de bases de données.
Eduardo
3
Si vous avez des problèmes d'autorisation, comme si vous n'avez pas la permission d'accéder à [master], cela fonctionne bien!
Jason Foglia
2
@MadTigger: vous ne devez pas inclure [ ]dans votre appel à db_id; c'est la syntaxe SQL, ne fait pas partie du nom de la base de données.
Jacob Krall
36
IF EXISTS (SELECT name FROM master.sys.databases WHERE name = N'YourDatabaseName')
  Do your thing...

Soit dit en passant, cela vient directement de SQL Server Studio, donc si vous avez accès à cet outil, je vous recommande de commencer à jouer avec les différentes fonctions "Script xxxx AS" disponibles. Vous facilitera la vie! :)

si618
la source
3
Si 'USE [Master]' ne vous convient pas, vous pouvez directement adresser la vue vue depuis n'importe quelle base de données en tant que 'master.sys.databases'
ProfK
8

J'aime la réponse de @ Eduardo et j'ai aimé la réponse acceptée. J'aime récupérer un booléen de quelque chose comme ça, alors je l'ai écrit pour vous les gars.

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

Vous pouvez maintenant l'utiliser comme ceci:

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

ESSAYE ÇA

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
la source