SQL Serverにデータベースが存在するかどうかを確認するにはどうすればよいですか?


272

TSQLを使用してSQL Serverにデータベースが存在するかどうかを確認する理想的な方法は何ですか?これを実装する方法は複数あるようです。

回答:


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 2009年

4
なぜテーブルへの参照を直接使用するのではなく、INFORMATION_SCHEMAを使用することが推奨されるのですか?
eKek0 2009年

4
一般的には、MicrosoftがINFORMATION_SCHEMAの形式にコミットし、システムテーブルを自由に変更する権利を留保しているためです。しかし、この場合、詳しく調べた後、INFORMATION_SCHEMAは機能しないため、これがおそらく最良のオプションです。
mwigdahl 2009年

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
まあそれは確かに短く、より不可解です。好奇心から、なぜそれが良いのですか?
Mike K

7
おそらく、db_idは[master]
Anthony

4
ええ、そうです。加えて、db_idは数値を照会するので、db_id()が受け入れられた回答よりも悪い(同じ複雑さ/コストになる可能性がある)ことはほぼ不可能です。そのため、データベース開発者によって行われたため、よりスマートな方法で実装されているdb_id()に賭けます。
エドゥアルド

3
[master]にアクセスする権限がないなど、権限の問題がある場合は、これで問題ありません。
Jason Foglia

2
@MadTigger:[ ]への呼び出しに含めるべきではありませんdb_id。これはSQL構文であり、データベース名の一部ではありません。
Jacob Krall 2017

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

ちなみに、これはSQL Server Studioから直接提供されたものなので、このツールにアクセスできる場合は、利用可能なさまざまな "Script xxxx AS"関数を試してみることをお勧めします。あなたの人生を楽にします!:)


3
「[マスター]を使用」が不都合な場合は、任意のデータベースのビュービューを「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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.