Как проверить, существует ли база данных в SQL Server?


272

Каков идеальный способ проверить, существует ли база данных на SQL Server с использованием TSQL? Кажется, несколько подходов для реализации этого.

Ответы:


165

Из скрипта 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
Это может быть из сценария Microsoft, но это не рекомендованная Microsoft практика. Они поощряют использование представлений INFORMATION_SCHEMA, а не прямой доступ к системным таблицам.
Мвигдаль

4
Почему рекомендуется использовать INFORMATION_SCHEMA вместо прямых ссылок на таблицы?
eKek0

4
Как правило, это происходит потому, что Microsoft принимает формат INFORMATION_SCHEMA и оставляет за собой право изменять системные таблицы по своему усмотрению. Но в этом случае, если присмотреться, INFORMATION_SCHEMA не работает, так что это, вероятно, лучший вариант.
Мвигдаль

3
Я согласен, что INFORMATION_SCHEMA предпочтительнее для проверки объектов в базе данных. Но может ли INFORMATION_SCHEMA использоваться для проверки самой БД? <<<<< ............... CHECK_CONSTRAINTS Проверка ограничений COLUMN_DOMAIN_USAGE Каждый столбец, который имеет определенный пользователем тип данных. COLUMN_PRIVILEGES Каждый столбец с привилегией, предоставленной или текущим пользователем в текущей базе данных. COLUMNS Перечисляет каждый столбец в системе. CONSTRAINT_COLUMN_USAGE Каждый столбец, для которого определено ограничение. CONSTRAINT_TABLE_USAGE Каждая таблица, для которой определено ограничение.
granadaCoder

2
@mwigdahl - Пожалуйста, предоставьте ссылку для этой заявленной рекомендуемой практики.
Мартин Смит

526

На самом деле лучше всего использовать:

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

См. Https://docs.microsoft.com/en-us/sql/t-sql/functions/db-id-transact-sql.


3
Ну, это, конечно, короче и более загадочно. Из любопытства, почему это лучше?
Майк К

7
Предположительно потому, что db_id безопаснее, чем проверка имени базы данных в определенном месте[master]
Энтони

4
Ну да, плюс к тому, что db_id () почти невозможно быть хуже (может быть той же сложности / стоимости), что и принятый ответ, так как db_id запрашивает число. Поэтому я скорее сделаю ставку на то, чтобы db_id () был реализован более разумно, поскольку это было сделано разработчиками баз данных.
Эдуардо

3
Если у вас есть проблемы с разрешением, например, у вас нет разрешения на доступ к [master], это работает хорошо!
Джейсон Фолья

2
@MadTigger: вы не должны включать [ ]в свой звонок db_id; это синтаксис SQL, а не часть имени базы данных.
Джейкоб Кралл

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

Кстати, это пришло непосредственно из SQL Server Studio, поэтому, если у вас есть доступ к этому инструменту, я рекомендую вам начать играть с различными доступными функциями «Script xxxx AS». Сделает вашу жизнь проще! :)


3
Если «USE [Master]» неудобно, вы можете напрямую обратиться к представлению представления из любой базы данных как «master.sys.databases»
ProfK

8

Мне нравится ответ @ Eduardo, и мне понравился принятый ответ. Мне нравится возвращать логическое значение от чего-то подобного, поэтому я написал это для вас, ребята.

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

Теперь вы можете использовать это так:

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

2

ПОПРОБУЙ ЭТО

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.