2012-07-20 66 views
0

好,我已在如果從不同的DATABSE存在Report以下查詢MS SQL IF語句執行IF和ELSE塊

IF NOT EXISTS (SELECT name 
       FROM sys.databases 
       WHERE name = N'Report') 
    BEGIN 
     DECLARE @DatabasePath NVARCHAR(1000); 
     SET @DatabasePath = (SELECT ResultMessage + '\' 
          FROM [Admin]..[Process]); 
     EXEC ispCREATEDB N'Report', @DatabasePath, N'10MB', N'20%' 
    END 
ELSE 
    BEGIN 
     IF EXISTS (SELECT * 
        FROM Report.sys.objects 
        WHERE name = N'FatalErrSumm' AND type = N'U') 
     BEGIN 
      DROP TABLE [Report]..[FatalErrSumm]; 
      CREATE TABLE [Report]..[FatalErrSumm] 
      (
       [MDF] NVARCHAR(255) NULL, 
       [Error] INT NULL, 
      ); 
     END 
    END 

此檢查;如果它不存在,則創建它,如果它存在,則檢查表FatalErrSumm是否存在,如果存在,則刪除並重新創建它。

的問題是,它似乎是執行IF NOT EXISTS塊都possiblities並給予錯誤

Msg 2702, Level 16, State 2, Line 24 
Database 'Report' does not exist. 

當數據庫Report不存在。所以它不應該輸入ELSE塊,但它似乎是。這是非常基本的東西,但我不能爲我的生活發現錯誤,我在這裏做錯了什麼?

謝謝你的時間。

回答

1

你應該使用動態SQL

IF NOT EXISTS (SELECT name 
       FROM sys.databases 
       WHERE name = N'Report') 
    BEGIN 
     DECLARE @DatabasePath NVARCHAR(1000); 
     SET @DatabasePath = (SELECT ResultMessage + '\' 
          FROM [Admin]..[Process]); 
     EXEC ispCREATEDB N'Report', @DatabasePath, N'10MB', N'20%' 
    END 
ELSE IF DB_ID('Report') IS NOT NULL 
    EXEC 
    (
     'BEGIN 
     IF EXISTS (SELECT * 
        FROM Report.sys.objects 
        WHERE name = N''FatalErrSumm'' AND type = N''U'') 
     BEGIN 
      DROP TABLE [Report]..[FatalErrSumm]; 
      CREATE TABLE [Report]..[FatalErrSumm] 
      ( 
       [MDF] NVARCHAR(255) NULL, 
       [Error] INT NULL, 
      ); 
     END 
     END' 
     ); 
+0

這裏沒有理由使用動態SQL。你爲什麼認爲我應該把它變成動態的?謝謝你的時間。 – MoonKnight 2012-07-20 10:13:46

+1

如果運行代碼時數據庫報告不存在,將會出現錯誤。唯一的方法是使用動態sql繞過它。 – Madhivanan 2012-07-20 10:23:51

+0

有人假定這個代碼存在於一個過程中。 OP談到'一個查詢'不是一個程序。你需要動態的sql,否則不需要它。 – Paul 2012-07-20 14:55:41

-1

如果報告離線,我認爲這會失敗,請檢查數據庫是否在線/附加。 sys.databases表中有這個標誌。

也不要把你的陳述放在ELSE中。如果您輸入'THEN'部分,則創建數據庫。之後檢查它是否被創建。比總是檢查你FATALERRSUMM表,而不是從IF。

僞代碼:

if (not exists database) -- watch it not exists is really NOT EXISTS not just not online 
    create the database 

if (exists database and not online) 
    put online the database 

if (not exists database or not online database) 
    throw error 

if (exists table fatalerrsum) 
     drop table 
     create table 
+1

仍然會出現錯誤。 – Madhivanan 2012-07-20 10:05:38

+0

你是什麼意思的'在線'。如果數據庫未附加,則不會顯示爲第一個測試的一部分。檢查'FatalErrSumm'總是發生,如果數據庫被發現,我不明白你的意思在第二段。謝謝你的時間。 – MoonKnight 2012-07-20 10:16:46

+0

不知道爲什麼有人希望downvote工作解決方案? a)可以分離數據庫 b)可以使數據庫脫機(鼠標右鍵等) 從sys.databases中選擇名稱,state_desc – Paul 2012-07-20 14:13:56

1

我認爲動態SQL是針對很好的解決方案繞過它。因爲在編譯時編譯器檢查數據庫「報告」不存在於你的服務器中。