わかりました、それで私のスキーマはこれです:
テーブル:Timesheet_Hours
列:
これは、テーブルの非常に単純化されたバージョンですが、この説明の目的に役立ちます。人がタイムシートレコードを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
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