Як перевірити, чи існує база даних у SQL Server?


271

Який ідеальний спосіб перевірити наявність бази даних на SQL сервері за допомогою 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, а не отримувати прямий доступ до системних таблиць.
mwigdahl

4
Чому рекомендується використовувати INFORMATION_SCHEMA замість того, щоб безпосередньо використовувати посилання на таблиці?
eKek0

4
Загалом, це тому, що Microsoft бере на себе формат INFORMATION_SCHEMA і залишає за собою право змінювати системні таблиці за своїм бажанням. Але в цьому випадку, придивившись уважніше, INFORMATION_SCHEMA не працює, тому це, мабуть, найкращий варіант.
mwigdahl

3
Я погоджуюсь, що INFORMATION_SCHEMA є кращим для перевірки об'єктів ~ всередині бази даних. Але чи може INFORMATION_SCHEMA використовуватися для перевірки на сам db? <<<<< ............... 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

Мені подобається відповідь @ Едуардо, і мені сподобалась прийнята відповідь. Мені подобається повернути булеве з чогось подібного, тому я написав це для вас, хлопці.

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.