2009-03-24 18 views

Odpowiedz

116

Od Script Microsoftu:

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

, które mogą być ze skryptu Microsoft, ale nie jest to Microsoft zaleca praktykę. Zachęcają do używania widoków INFORMATION_SCHEMA zamiast bezpośredniego dostępu do tabel systemowych. – mwigdahl

+0

nie powinien "NIE ZNALEŹĆ" po prostu "EXISTS" –

+4

dlaczego zachęca się do używania INFORMATION_SCHEMA zamiast bezpośrednio odwoływać się do tabel? – eKek0

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

Nawiasem mówiąc, ten pochodzi bezpośrednio z SQL Server Studio, więc jeśli masz dostęp do tego narzędzia, polecam uruchomieniu gry z różnymi „Script xxxx AS "funkcje, które są dostępne. Ułatwi Ci życie! :)

+2

Jeśli "USE [Master]" jest niewygodne, możesz bezpośrednio adresować widok widoku z dowolnej bazy danych jako "master.sys.databases" – ProfK

416

Właściwie to najlepiej użyć:

if db_id('dms') is not null 
    --code mine :) 
    print 'db exists' 

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

+2

Cóż, jest to z pewnością krótsze i bardziej zagadkowe. Z ciekawości, dlaczego jest lepiej? –

+6

Prawdopodobnie dlatego, że db_id jest bezpieczniejsze niż sprawdzanie nazwy bazy danych w określonej lokalizacji w '[master]' – Anthony

+4

No cóż, tak, to jest prawie niemożliwe, aby db_id() było gorsze (mogłoby być tej samej złożoności/kosztu) niż zaakceptowana odpowiedź od zapytania db_id dla numeru. Tak więc raczej zakładam, że db_id() jest wdrażany w inteligentniejszy sposób, ponieważ zostało to wykonane przez programistów baz danych. – Eduardo

3

lubię @ odpowiedź Eduardo i lubiłem przyjętej odpowiedź. Chciałbym odzyskać boolean z czegoś takiego, więc napisałem to dla was.

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 

Teraz można go używać tak:

select [dbo].[DatabaseExists]('master') --returns 1 
select [dbo].[DatabaseExists]('slave') --returns 0 
Powiązane problemy