2009-03-24 59 views

答えて

116

:あなたは、このツールへのアクセス権を持っている場合、私はお勧めは、さまざまな「スクリプトで再生を開始するように、ところで

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' 
+5

が、それはMicrosoftが練習をお勧めしません。システムテーブルに直接アクセスするのではなく、INFORMATION_SCHEMAビューの使用を推奨します。 – mwigdahl

+0

は "存在しない"だけ存在するべきではありません –

+4

なぜテーブルへの参照を直接使用するのではなくINFORMATION_SCHEMAを使用することを推奨しますか? – eKek0

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

が、これは、SQL Serverのメーカーから直接来ましたxxxx AS "の機能を利用できます。あなたの人生を楽にしてくれるでしょう! :)

+2

'USE [Master]'が不便な場合は、任意のデータベースから直接ビュービューに「master.sys.databases」というアドレスを割り当てることができます – ProfK

416

実際にそれが使用することをお勧めします:

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

+2

確かに、それはもっと短く、より暗いです。好奇心の理由から、それはなぜより良いですか? –

+6

おそらくdb_idが '[master]'の特定の場所にあるデータベース名を確認するよりも安全だと思われます。 – Anthony

+4

それに、db_id()が悪い(ほぼ同じ複雑さ/コスト) db_idが数値を問い合わせるので、受け入れられた答え。ですから、db_id()は、データベース開発者によって行われたので、よりスマートな方法で実装されています。 – Eduardo

3

を参照してください。私はこのようなものからブール値を取り戻すのが好きなので、皆さんのために書きました。

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 

今、あなたはこのようにそれを使用することができます。Microsoftのスクリプトからのものであってもよい

select [dbo].[DatabaseExists]('master') --returns 1 
select [dbo].[DatabaseExists]('slave') --returns 0 
関連する問題