EmpLogという名前のテーブルに従業員の「開始」と「終了」データが含まれています。すべての異なる従業員に対応しなければならないので、私は更新中にトリガー内の変数をどのように変更するのかについてはかなり混乱しています。挿入するたびに、C#でSQLパラメータを使用してトリガを変更する必要がありますか?またはそれを最小限かつ効率的に保つための代替手段がありますか?前もって感謝します。私が知ることができる限り、トリガーはデータベースにハードコードされており、これは 'ALTER'によって変更可能です。トリガによって、異なるIDを持つ既存の行を変更するにはどうすればよいですか?SQLでC#を使用してトリガを使用して既存の行を更新する方法
create trigger TrgEmpLog on EmpLog
AFTER UPDATE
AS
declare @shiftstart time;
declare @shiftend time;
declare @totalminutes decimal(18,2);
IF EXISTS (SELECT shiftend FROM EmpLog WHERE EmpID = "C# Variable" and CONVERT(date,LogDate) = CONVERT(date, GETDATE()) and shiftend is not null)
BEGIN
IF EXISTS (SELECT EmpLog.TotalMinutes from EmpLog WHERE EmpID = "C# Variable" and CONVERT(date,LogDate) = CONVERT(date, GETDATE()) and TotalMinutes is not null)
BEGIN
ROLLBACK TRANSACTION
END
ELSE
select @shiftstart=EmpLog.ShiftStart from EmpLog where EmpID = "C# Variable" and CONVERT(date,LogDate) = CONVERT(date, GETDATE()) and TotalMinutes IS NULL;
select @shiftend=EmpLog.ShiftEnd from EmpLog where EmpID = "C# Variable" and CONVERT(date,LogDate) = CONVERT(date, GETDATE()) and TotalMinutes IS NULL;
select @totalminutes=DATEDIFF(MINUTE,@shiftstart, @shiftend);
UPDATE EmpLog
SET [email protected]/60.00
WHERE EmpID= "C# Variable"and CONVERT(date,LogDate) = CONVERT(date, GETDATE());
END
ELSE
BEGIN
ROLLBACK TRANSACTION
END
そして、私はトリガー入力を求めるように使用しているコードは次のとおりです。
UPDATE EmpLog
SET ShiftEnd = 'current time'
WHERE EmpID='C# variable' and CONVERT(date,LogDate) = CONVERT(date, GETDATE());
このコードは、以下のトリガーで終わるが、私は削除した場合、それは動作します「とLOGDATE = GETDATE() 。 UPDATE EmpLog SET ShiftEnd = '09:00:00 'EmpID = 1とCONVERT(date、LogDate)= CONVERT(日付、GETDATE())
問題の内容を正確に明確にすることはできますか? – Danieboy
不明な点をおかけして申し訳ありませんが、私はSQLに慣れていません。私は、データベースにハードコードされている限り、どのように異なる 'WHERE'変数でトリガーを利用できるようになるのかという論理を理解できません。 – user3442765
トリガーにパラメータを渡すことはできません。あなたはストアドプロシージャでそれを行うことができます。あなたのロジックが複雑で、あなたのロジックがそうであると思われる場合は、ストアドプロシージャが必要です。トリガーは、ユーザーIDおよびレコードの更新日の更新など、データの挿入、更新、または削除時に実行する必要のある軽量操作を目的としています。あなたの 'TotalMinutes'フィールドは、テーブル上の計算されたフィールドにも役立ちます。 –