2009-03-24 43 views

Trả lời

116

Từ một của Microsoft kịch bản:

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

Đó có thể là từ một kịch bản Microsoft nhưng nó không phải Microsoft khuyến cáo thực hành. Họ khuyến khích sử dụng các khung nhìn INFORMATION_SCHEMA hơn là truy cập trực tiếp vào các bảng hệ thống. – mwigdahl

+0

không nên "KHÔNG tồn tại" chỉ là "EXISTS" –

+4

tại sao khuyến khích sử dụng INFORMATION_SCHEMA thay vì trực tiếp sử dụng tham chiếu đến bảng? – eKek0

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

Bằng cách này, này đến trực tiếp từ SQL Server Studio, vì vậy nếu bạn có quyền truy cập vào công cụ này, tôi khuyên bạn nên bắt đầu chơi với nhiều "Script xxxx AS "các chức năng có sẵn. Sẽ làm cho cuộc sống của bạn dễ dàng hơn! :)

+2

Nếu 'SỬ DỤNG [Thạc sĩ]' là bất tiện, bạn có thể trực tiếp giải quyết chế độ xem xem từ bất kỳ cơ sở dữ liệu nào như 'master.sys.databases' – ProfK

416

Trên thực tế nó là tốt nhất để sử dụng:

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

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

+2

Vâng, điều đó chắc chắn ngắn hơn và khó hiểu hơn. Trong tò mò, tại sao nó tốt hơn? –

+6

Có lẽ vì db_id an toàn hơn việc kiểm tra tên cơ sở dữ liệu ở một vị trí cụ thể trong '[master]' – Anthony

+4

Vâng, vâng, và gần như không thể cho db_id() tồi tệ hơn (có thể phức tạp/chi phí) câu trả lời được chấp nhận vì các truy vấn db_id cho một số. Vì vậy, tôi thích đặt cược vào db_id() đang được triển khai một cách thông minh hơn, vì nó được thực hiện bởi các nhà phát triển cơ sở dữ liệu. – Eduardo

3

Tôi thích câu trả lời @ Eduardo và tôi thích câu trả lời chấp nhận. Tôi muốn lấy lại một boolean từ một cái gì đó như thế này, vì vậy tôi đã viết nó lên cho các bạn.

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 

Bây giờ bạn có thể sử dụng nó như thế này:

select [dbo].[DatabaseExists]('master') --returns 1 
select [dbo].[DatabaseExists]('slave') --returns 0 
Các vấn đề liên quan