2016-11-28 26 views
5

aşağıdaki deyimi ile başlar uzun saklı yordam vardır: O yoksa, benim yerel sunucuda DB yaratması bekleniyorSQL veritabanı oluşturmak, beklenmedik davranışlar

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

. Sorun şu ki, hemen hemen tüm zamanlar saklı yordamın bu kısmına gidiyor ve onu oluşturmuyor, ki bu da aynı prosedürden diğer kodu engelliyor. Öte yandan, çok nadir durumlarda, DB oluşturur. Sorum şu: DB varlığının kontrol edilmesi daha iyi bir yolu var mı, ben zaten denedim en az 10.

diğer yolları denedim çünkü:

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; 

Ama benim sp dışında çalıştırırsanız, Mükemmel çalışıyor, bu da bana izinlerle ilgili bir sorun olabileceğini düşündürüyor. çalışmazsa

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

kullanılarak

+0

zaten 2014 yılında çalışan ve doğru sonucu gösteriyor (isim = N'DBNAME 'sys.databases SELECT *) kullandığınızda. Bir hata mı alıyorsun? – Dhwani

+1

ur proc .. bir parçası olarak herhangi bir geri dönüş kullandınız mı? Evet evet sonra geri alınıyor kontrol edin .. –

+0

Hayır, ben saklı yordamında kullanmaya çalıştığınızda, veritabanı 'DBNAME' yok, yalnızca almak Daha sonra. Bir işlem kullanmıyorum. – StefanL19

cevap

9

deneyin, bu izinleri olabilir. Bu, neden bir hata mesajı almadığınızı açıklar. "... İlgili satırı görmek için gereken minimum izinler ALTER HERHANGİ BİR VERİ TABANI veya VIEW HERHANGİ BİR VERİTABANI sunucu düzeyinde izne veya ana veritabanında CREATE DATABASE iznine sahiptir.Yazıranın bağlı olduğu veritabanı her zaman sys içinde görüntülenebilir. veritabanları "(https://msdn.microsoft.com/en-us/library/ms178534.aspx'dan).

Kullandığınız kullanıcı hangi izinlere sahiptir?

Sys.databases içeriğini görüntülemek için kodunuzu değiştirmeyi deneyin.

+0

Aynı sonucu elde ediyorum. – StefanL19

+0

, izinlerle ilgili yorumları eklemek için yanıtı değiştirdi. Bunu deneyin – under

0

karşılaştıran dizeleri DEĞİL VARSA GİBİ

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

Özel durum için, hiçbir fark yaratmıyor. – StefanL19