2016-11-28 18 views
5

Mam procedurę długo przechowywane, która rozpoczyna się z następującym stwierdzeniem:SQL tworzyć bazy danych, jeśli nie istnieje, nieoczekiwane zachowanie

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

oczekuje się, aby utworzyć DB na moim lokalnym serwerze, jeśli nie istnieje. Problem polega na tym, że prawie cały czas przechodzi tę część procedury przechowywanej i jej nie tworzy, co następnie koliduje z innym kodem z tej samej procedury. Z drugiej strony, w bardzo rzadkich przypadkach tworzy DB. Moje pytanie brzmi: Czy istnieje lepszy sposób, aby sprawdzić, czy istnieje DB, bo ja już próbowałem przynajmniej 10.

Inne sposoby ja próbowałem:

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; 

Ale jeśli uruchomić go poza moją sp działa to doskonale, co powoduje, że myślę, że może to być problem związany z uprawnieniami.

+0

IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = N'DBNAME ') pracuje już w 2014 roku i wykazujących prawidłowy wynik. Czy otrzymujesz błąd? – Dhwani

+1

czy użyłeś jakiegokolwiek wycofania jako części proc proc .. jeśli tak to sprawdź, czy nie zostanie wycofany .. –

+0

Nie, po prostu dostaję DBNAME bazy danych, nie istnieje, kiedy próbuję użyć go w procedurze przechowywanej po tym. Nie używam transakcji. – StefanL19

Odpowiedz

9

Spróbuj użyć

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

Jeśli nie działa, to może być uprawnienia. to wyjaśniałoby, dlaczego nie otrzymujesz komunikatu o błędzie. "... minimalnymi uprawnieniami wymaganymi do wyświetlenia odpowiedniego wiersza są ZMIANA KAŻDEGO BAZY DANYCH lub ZOBACZ WSZELKIE BAZY DANYCH uprawnienia na poziomie serwera lub uprawnienie CREATE DATABASE w głównej bazie danych. Baza danych, z którą wywołujący jest połączony, może być zawsze wyświetlana w systemie. bazy danych "(od https://msdn.microsoft.com/en-us/library/ms178534.aspx).

Jakie uprawnienia ma użytkownik, którego używasz?

Spróbuj zmienić kod, aby po prostu zwrócić zawartość sys.databases, abyś mógł ją zobaczyć.

+0

Otrzymuję ten sam wynik. – StefanL19

+0

zmienił odpowiedź, aby dodać komentarze na temat uprawnień. Wypróbuj to – under

0

Podczas porównywania ciągów używać jak

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

W konkretnym przypadku nie ma to znaczenia. – StefanL19

Powiązane problemy