web-dev-qa-db-ja.com

SQL Serverが存在しない場合は?

わかりました、それで私のスキーマはこれです:

テーブル:Timesheet_Hours

列:

  • Timesheet_Id(PK、int)
  • Staff_Id(int)
  • BookedHours(int)
  • Posted_Flag(ブール値)

これは、テーブルの非常に単純化されたバージョンですが、この説明の目的に役立ちます。人がタイムシートレコードを1つだけ持つことができると仮定します。

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

Timesheet_Hoursを更新する前に、関連するタイムシートがまだ投稿されていないことを最初に確認し、次に実際に更新するレコードが実際にあるかどうかを確認します。

タイムシートがまだ投稿されていないことを確認するifステートメントの最初の部分は正常に機能します。問題は2番目の部分です。更新しようとしているレコードが既に存在することを確認するためにcheckintです。問題は、常にエラーが発生することです。

注:以下のコードは、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
40
Ryan Kirkman

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
44
Rick