¿Cómo verificar si existe una base de datos en SQL Server?


272

¿Cuál es la forma ideal de verificar si existe una base de datos en un servidor SQL usando TSQL? Parece múltiples enfoques para implementar esto.

Respuestas:


165

Del 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'

77
Eso puede ser de un script de Microsoft pero no es una práctica recomendada por Microsoft. Animan a usar las vistas INFORMATION_SCHEMA en lugar de acceder directamente a las tablas del sistema.
mwigdahl

44
¿Por qué se recomienda usar INFORMATION_SCHEMA en lugar de usar directamente referencias a tablas?
eKek0

44
En general, se debe a que Microsoft se compromete con el formato INFORMATION_SCHEMA y se reserva el derecho de cambiar las tablas del sistema a su gusto. Pero en este caso, después de mirar más de cerca, INFORMATION_SCHEMA no funciona, por lo que esta es probablemente la mejor opción.
mwigdahl

3
Estoy de acuerdo que INFORMATION_SCHEMA es preferido para verificar objetos ~ dentro de una base de datos. ¿Pero puede INFORMATION_SCHEMA utilizar para verificar el db en sí? <<<<< ............... CHECK_CONSTRAINTS Verificar restricciones COLUMN_DOMAIN_USAGE Cada columna que tiene un tipo de datos definido por el usuario. COLUMN_PRIVILEGES Cada columna con un privilegio otorgado ao por el usuario actual en la base de datos actual. COLUMNS Enumera todas las columnas del sistema CONSTRAINT_COLUMN_USAGE Cada columna que tiene una restricción definida. CONSTRAINT_TABLE_USAGE Cada tabla que tiene una restricción definida en ella.
granadaCoder

2
@mwigdahl: proporcione una referencia para esta práctica recomendada recomendada.
Martin Smith

526

En realidad, es mejor usar:

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


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

77
Presumiblemente porque db_id es más seguro que buscar un nombre de base de datos en una ubicación específica en[master]
Anthony

44
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 un número. Así que prefiero apostar a que db_id () se implemente de una manera más inteligente, ya que fue realizado por los desarrolladores de la base de datos.
Eduardo

3
Si tiene problemas con los permisos, como si no tuviera permiso para acceder a [maestro], ¡esto funciona bien!
Jason Foglia

2
@MadTigger: no debe incluir [ ]en su llamada a db_id; esa es la sintaxis SQL, no es parte del nombre de la base de datos.
Jacob Krall

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

Por cierto, esto vino directamente de SQL Server Studio, por lo que si tiene acceso a esta herramienta, le recomiendo que comience a jugar con las diversas funciones "Script xxxx AS" que están disponibles. ¡Te hará la vida más fácil! :)


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

8

Me gusta la respuesta de @ Eduardo y me gustó la respuesta aceptada. Me gusta recuperar un booleano de algo como esto, 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 puedes usarlo así:

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

2

PRUEBA ESTO

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.