Làm cách nào để kiểm tra xem cơ sở dữ liệu có tồn tại trong SQL Server không?


272

Cách lý tưởng để kiểm tra xem cơ sở dữ liệu có tồn tại trên Máy chủ SQL bằng TSQL không? Có vẻ như nhiều cách tiếp cận để thực hiện điều này.

Câu trả lời:


165

Từ một tập lệnh của 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
Đó có thể là từ tập lệnh của Microsoft nhưng Microsoft không khuyến nghị thực hành. Họ khuyến khích sử dụng các khung nhìn Information_SCHema thay vì truy cập trực tiếp vào các bảng hệ thống.
mwigdahl

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

4
Nói chung, vì Microsoft cam kết định dạng THÔNG TIN_SCHema và bảo lưu quyền thay đổi các bảng hệ thống theo ý muốn. Nhưng trong trường hợp này, sau khi xem xét kỹ hơn, Information_SCHema không hoạt động, vì vậy đây có lẽ là lựa chọn tốt nhất.
mwigdahl

3
Tôi đồng ý Information_SCHema được ưu tiên kiểm tra các đối tượng ~ bên trong cơ sở dữ liệu. Nhưng liệu có thể sử dụng Information_SCHema để kiểm tra db không? <<<<< ............... CHECK_CONSTRAINTS Kiểm tra các ràng buộc COLUMN_DOMAIN_USAGE Mỗi cột có kiểu dữ liệu do người dùng xác định. COLUMN_PRIVILEGES Mỗi cột có đặc quyền được cấp cho hoặc bởi người dùng hiện tại trong cơ sở dữ liệu hiện tại. COLUMNS Liệt kê mọi cột trong hệ thống CONSTRAINT_COLUMN_USAGE Mỗi cột có một ràng buộc được xác định trên đó. CONSTRAINT_TABLE_USAGE Mỗi bảng có một ràng buộc được xác định trên đó.
granadaCoder

2
@mwigdahl - Vui lòng cung cấp tài liệu tham khảo cho thực hành được đề nghị này.
Martin Smith

526

Trên thực tế, tốt nhất nên 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/fifts/db-id-transact-sql


3
Chà, nó chắc chắn ngắn hơn và khó hiểu hơn. Vì tò mò, tại sao nó tốt hơn?
Mike K

7
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
Chà, vâng, cộng với việc db_id () gần như không thể tệ hơn (có thể có cùng độ phức tạp / chi phí) so với 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 đặt cược vào việc db_id () được triển khai theo 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
Nếu bạn có vấn đề về quyền, như bạn không có quyền truy cập [master] thì điều này hoạt động tốt!
Jason Foglia

2
@MadTigger: bạn không nên bao gồm [ ]trong cuộc gọi đến db_id; đó là cú pháp SQL, không phải là một phần của tên cơ sở dữ liệu.
Jacob Krall

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

Nhân tiện, điều 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 các chức năng "Script xxxx AS" khác nhau có sẵn. Sẽ làm cho cuộc sống của bạn dễ dàng hơn! :)


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

8

Tôi thích câu trả lời của @ Eduardo và tôi thích câu trả lời được 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

2

THỬ CÁI NÀY

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.