2016-11-28 27 views
5

Tôi có một thủ tục lưu trữ lâu mà bắt đầu với tuyên bố sau:SQL tạo cơ sở dữ liệu nếu không tồn tại, hành vi bất ngờ

IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = N'DBNAME') 
    BEGIN 
     CREATE DATABASE [DBNAME] 
    END; 

Nó được kỳ vọng sẽ tạo DB trên máy chủ địa phương của tôi, nếu nó không tồn tại. Vấn đề là hầu như tất cả thời gian nó đi thorugh phần này của thủ tục lưu trữ và không tạo ra nó, mà sau đó can thiệp với các mã khác từ các thủ tục tương tự. Mặt khác, trong trường hợp rất hiếm, nó tạo ra DB. Câu hỏi của tôi là: Có cách nào tốt hơn để kiểm tra nếu DB tồn tại, bởi vì tôi đã cố gắng ít nhất 10

cách khác tôi đã cố gắng:

IF NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = N'DBNAME') 
    BEGIN 
     CREATE DATABASE [DBNAME] 
    END; 

IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'DBNAME') 
     BEGIN 
      CREATE DATABASE [DBNAME] 
     END; 

IF NOT EXISTS (SELECT name FROM master.dbo.sys.databases WHERE name = N'DBNAME') 
      BEGIN 
       CREATE DATABASE [DBNAME] 
     END; 

Nhưng nếu tôi chạy nó bên ngoài của sp của tôi , nó hoạt động hoàn hảo, khiến tôi nghĩ rằng nó có thể là một số vấn đề liên quan đến quyền.

+0

NẾU NOT EXISTS (SELECT * FROM sys.databases WHERE name = N'DBNAME ') đã được làm việc trong năm 2014 và hiển thị kết quả chính xác. Bạn nhận được bất kỳ lỗi nào? – Dhwani

+1

bạn đã sử dụng bất kỳ cuộn trở lại như là một phần của ur proc ..if có sau đó kiểm tra xem nó không được cuộn lại .. –

+0

Không, tôi chỉ nhận được Database 'DBNAME' không tồn tại, khi tôi cố gắng sử dụng nó trong thủ tục lưu sẵn sau đó. Tôi không sử dụng giao dịch. – StefanL19

Trả lời

9

Hãy thử sử dụng

If(db_id(N'DBNAME') IS NULL) 

Nếu không hoạt động, nó có thể là các điều khoản. điều đó sẽ giải thích tại sao bạn không nhận được thông báo lỗi. "... quyền tối thiểu cần thiết để xem hàng tương ứng là ALTER BẤT CỨ DATABASE hoặc XEM BẤT CỨ cấp phép máy chủ cấp phép DATABASE hoặc quyền CREATE DATABASE trong cơ sở dữ liệu chính. Cơ sở dữ liệu mà người gọi được kết nối luôn có thể được xem trong sys. cơ sở dữ liệu "(từ https://msdn.microsoft.com/en-us/library/ms178534.aspx).

Quyền người dùng mà bạn đang chạy có quyền gì?

Hãy thử thay đổi mã của bạn để chỉ trả lại nội dung của sys.databases để bạn có thể xem nó.

+0

Tôi nhận được kết quả tương tự. – StefanL19

+0

đã thay đổi câu trả lời để thêm nhận xét về quyền. Hãy thử rằng – under

0

Khi chuỗi so sánh sử dụng LIKE

if (SELECT count(name) FROM sys.databases WHERE name LIKE '%DBNAME%') = 0 
+0

Đối với trường hợp cụ thể, nó không có sự khác biệt. – StefanL19

Các vấn đề liên quan