1. ホーム
  2. sql

[解決済み] SQL Server IF NOT EXISTSの使用法?

2022-03-01 18:07:08

質問

OK、では私のスキーマはこれです。

テーブル タイムシート_時間

列です。

  • タイムシートID (PK, int)
  • スタッフID (int)
  • BookedHours (int)
  • 投稿フラグ (ブール値)

これは極めて単純化されたテーブルですが、この説明の目的には十分役立つでしょう。一人の人が持つタイムシートレコードは1つだけだと仮定します。

私が行おうとしているのは、WorkLogという別のテーブルにレコードを追加することです。このテーブルの各レコードには、時間が関連付けられています。このテーブルが更新されると、Timesheet_Hoursも更新したいのです。

Timesheet_Hoursを更新する前に、まず該当するTimesheetがすでに投稿されていないかどうか、そして、そもそも更新すべきレコードがあるかどうかを確認したいと思います。

if文の最初の部分、つまりタイムシートがすでに計上されていないことを確認する部分は問題なく動作します。問題は2番目の部分です。更新しようとするレコードがすでに存在するかどうかをチェックしています。問題は、常にエラーを発生させることです。

注:以下のコードは、WorkLogテーブルの更新、挿入、および削除トリガーによって実行されるストアドプロシージャから抜粋したものです。PersonIDは、そのテーブルのパラメータの1つです。このストアド プロシージャは、このステートメントの 2 番目の部分をコメントアウトすると正常に動作します。

IF EXISTS
    (
    SELECT 1
    FROM Timesheet_Hours
    WHERE Posted_Flag = 1
    AND Staff_Id = @PersonID
    )

    BEGIN
        RAISERROR('Timesheets have already been posted!', 16, 1)
        ROLLBACK TRAN
    END
ELSE
    IF NOT EXISTS
        (
        SELECT 1
        FROM Timesheet_Hours
        WHERE Staff_Id = @PersonID
        )

        BEGIN
            RAISERROR('Default list has not been loaded!', 16, 1)
            ROLLBACK TRAN
        END

解決方法は?

Staff_Id = @PersonID となる行が実際に存在することを確認しましたか? 投稿された内容は、行が存在すると仮定して、テストスクリプトで問題なく動作します。 insertステートメントをコメントアウトすると、エラーが発生します。

set nocount on

create table Timesheet_Hours (Staff_Id int, BookedHours int, Posted_Flag bit)

insert into Timesheet_Hours (Staff_Id, BookedHours, Posted_Flag) values (1, 5.5, 0)

declare @PersonID int
set @PersonID = 1

IF EXISTS    
    (
    SELECT 1    
    FROM Timesheet_Hours    
    WHERE Posted_Flag = 1    
        AND Staff_Id = @PersonID    
    )    
    BEGIN
        RAISERROR('Timesheets have already been posted!', 16, 1)
        ROLLBACK TRAN
    END
ELSE
    IF NOT EXISTS
        (
        SELECT 1
        FROM Timesheet_Hours
        WHERE Staff_Id = @PersonID
        )
        BEGIN
            RAISERROR('Default list has not been loaded!', 16, 1)
            ROLLBACK TRAN
        END
    ELSE
        print 'No problems here'

drop table Timesheet_Hours