2009-03-24 6 views

Répondre

116

D'un script de 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' 
+5

Ce peut être d'un script Microsoft mais 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

+0

ne devrait pas "PAS EXISTE" juste être "EXISTE" –

+4

pourquoi est encourageant utilisant INFORMATION_SCHEMA au lieu d'utiliser directement des références aux tables? – eKek0

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

D'ailleurs, ce sont venus directement à partir de Studio SQL Server, donc si vous avez accès à cet outil, je vous recommande de commencer à jouer avec les différents « Script xxxx AS "fonctions disponibles. Cela vous facilitera la vie! :)

+2

Si 'USE [Master]' n'est pas pratique, vous pouvez directement accéder à la vue depuis n'importe quelle base de données en tant que 'master.sys.databases' – ProfK

416

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

+2

Eh bien, c'est certainement plus court et plus cryptique. Par curiosité, pourquoi est-ce mieux? –

+6

Probablement parce que db_id est plus sûr que de vérifier un nom de base de données dans un emplacement spécifique dans '[master]' – Anthony

+4

Eh bien, oui, et il est quasiment impossible que db_id() soit pire (pourrait être la même complexité/coût) la réponse acceptée depuis les requêtes db_id pour un nombre. Je préfère par conséquent 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

J'aime @ la réponse d'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 

Maintenant, vous pouvez l'utiliser comme ceci:

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