2012-07-20 55 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是针对很好的解决方案绕过它。因为在编译时编译器检查数据库“报告”不存在于你的服务器中。