MS SQL IF语句执行IF和ELSE块

时间:2012-07-20 09:52:01

标签: sql sql-server-2008 if-statement

全部,我有以下查询

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

检查来自不同数据库的Report是否存在;如果它不存在,则创建它,如果存在,则检查表FatalErrSumm是否存在,如果存在,则删除并重新创建它。

问题在于它似乎正在执行IF NOT EXISTS块的两种可能性并给出错误

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

数据库Report不存在时。所以它永远不应该进入ELSE块,但它似乎是。这是非常基本的东西,但我不能为我的生活发现错误,我在这里做错了什么?

感谢您的时间。

3 个答案:

答案 0 :(得分: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'
        );

答案 1 :(得分:1)

我认为动态sql是一个很好的解决方案。因为在编译时编译器检查到您的服务器中不存在数据库“report”。

答案 2 :(得分:-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