0

所有,我有以下查询

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街区,但它似乎是。这是非常基本的东西,但我一生都无法发现错误,我在这里做错了什么?

谢谢你的时间。

4

3 回答 3

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'
        );
于 2012-07-20T10:04:54.717 回答
1

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

于 2012-07-20T10:31:07.477 回答
-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
于 2012-07-20T10:03:32.643 回答