Como verificar se existe um banco de dados no SQL Server?


272

Qual é a maneira ideal de verificar se existe um banco de dados em um SQL Server usando TSQL? Parece várias abordagens para implementar isso.

Respostas:


165

No script de uma 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
Isso pode ser de um script da Microsoft, mas não é uma prática recomendada pela Microsoft. Eles incentivam o uso das visualizações INFORMATION_SCHEMA em vez de acessar diretamente as tabelas do sistema.
Mwigdahl

4
por que incentivar usar o INFORMATION_SCHEMA em vez de usar diretamente as referências às tabelas?
EKek0

4
Em geral, é porque a Microsoft se compromete com o formato INFORMATION_SCHEMA e se reserva o direito de alterar as tabelas do sistema como desejar. Mas, nesse caso, depois de olhar mais de perto, o INFORMAÇÕES_SCHEMA não funciona, portanto essa é provavelmente a melhor opção.
Mwigdahl

3
Concordo que o Information_SCHEMA é o preferido para verificar objetos ~ dentro de um banco de dados. Mas o Information_SCHEMA pode ser usado para verificar o próprio banco de dados? <<<<< ............... CHECK_CONSTRAINTS Verificar restrições COLUMN_DOMAIN_USAGE Cada coluna que possui um tipo de dados definido pelo usuário. COLUMN_PRIVILEGES Cada coluna com um privilégio concedido ao usuário atual no banco de dados atual ou pelo usuário atual. COLUMNS Lista todas as colunas do sistema CONSTRAINT_COLUMN_USAGE Cada coluna que possui uma restrição definida. CONSTRAINT_TABLE_USAGE Toda tabela que possui uma restrição definida.
usar o seguinte código

2
@mwigdahl - forneça uma referência para esta prática recomendada reivindicada.
Martin Smith

526

Na verdade, é melhor usar:

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

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


3
Bem, é certamente mais curto e mais enigmático. Por curiosidade, por que é melhor?
Mike K

7
Presumivelmente porque db_id é mais seguro do que a verificação de um nome de banco de dados em um local específico na[master]
Anthony

4
Bem, sim, mais que é quase impossível que db_id () seja pior (poderia ter a mesma complexidade / custo) do que a resposta aceita, já que o db_id consulta um número. Por isso, aposto que o db_id () está sendo implementado de maneira mais inteligente, pois foi feito pelos desenvolvedores do banco de dados.
Eduardo

3
Se você tiver problemas de permissão, como você não tem permissão para acessar [master], isso funciona bem!
21816 Jason Foglia

2
@ MadTigger: você não deve incluir [ ]na sua chamada para db_id; essa é a sintaxe SQL, não faz parte do nome do banco de dados.
26630 Jacob Krall

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

A propósito, isso veio diretamente do SQL Server Studio; portanto, se você tiver acesso a essa ferramenta, recomendo que comece a jogar com as várias funções "Script xxxx AS" disponíveis. Vai facilitar a sua vida! :)


3
Se 'USE [Master]' for inconveniente, você poderá abordar diretamente a exibição da visualização de qualquer banco de dados como 'master.sys.databases'
ProfK

8

Gosto da resposta de @ Eduardo e gostei da resposta aceita. Eu gosto de receber um booleano de algo assim, então escrevi para vocês.

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

Agora você pode usá-lo assim:

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

2

TENTE ISSO

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.