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」部分を入力すると、データベースが作成されます。その後、作成されているかどうかを確認します。IFからではなく、FATALERRSUMMテーブルを常にチェックしてください。

擬似コード:

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 に答える