2009-03-24 27 views

Respuesta

116

Desde el guión de un 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

que puede ser desde un script de Microsoft pero no es Microsoft práctica recomendada. Fomentan el uso de las vistas INFORMATION_SCHEMA en lugar de acceder directamente a las tablas del sistema. – mwigdahl

+0

no debería "NO EXISTE" simplemente ser "EXISTE" –

+4

¿por qué se fomenta el uso de INFORMATION_SCHEMA en lugar de utilizar directamente referencias a tablas? – eKek0

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

Por cierto, esto vino directamente desde el servidor Studio SQL, así que si usted tiene acceso a esta herramienta, te recomiendo empezar a jugar con los diferentes "script xxxx AS "funciones que están disponibles. Hará tu vida más fácil! :)

+2

Si 'USE [Master]' es inconveniente, puede abordar directamente la vista desde cualquier base de datos como 'master.sys.databases' – ProfK

416

En realidad, es mejor utilizar:

if db_id('dms') is not null 
    --code mine :) 
    print 'db exists' 

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

+2

Bueno, es ciertamente más corto y más críptico. Por curiosidad, ¿por qué es mejor? –

+6

Probablemente porque db_id es más seguro que buscar un nombre de base de datos en una ubicación específica en '[maestro]' – Anthony

+4

Bueno, sí, además de que es casi imposible que db_id() sea peor (podría ser la misma complejidad/costo) que la respuesta aceptada ya que db_id consulta por un número. Así que prefiero apostar a que db_id() se implemente de una forma más inteligente, ya que fue realizado por los desarrolladores de la base de datos. – Eduardo

3

me gusta @ respuesta de Eduardo y me gustó la respuesta aceptada. Me gustaría obtener un booleano de algo así, así que lo escribí para ustedes.

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 

Ahora se puede utilizar de esta manera:

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