わかった。SQL バックエンドを使ってシンプルな作業をする前に、ここで多くの助けを得ました ... 私には向いていません :( ... 私が働いている小さなオフィスのタイム クロック ソリューションなので、もっと戻ってきました!
現在作業しているテーブルは、6 つの列で構成されています。
- clockDate 日付が null でない PK
- userName varchar(50) NULL PK ではありません
- クロックインタイム(0)
- ブレイクアウトタイム(0)
- 休憩時間(0)
- 出勤時間(0)
前回の質問から自分のステートメントを理解していましたIF NOT EXISTS INSERT ELSE UPDATE
が、今は単純なクエリ ウィンドウではなくストアド プロシージャで使用しようとしていますが、成功していません。
基本的に、ユーザーの出勤は簡単です。ただし、ユーザーが出勤せず、昼食のために退勤する場合、ステートメントは既存の行を更新する代わりに行を作成する必要があります。わかりましたので、ここに私のストアドプロシージャがあります:
ALTER PROCEDURE dbo.BreakOut
(
@userName varchar(50)
)
AS
IF EXISTS (SELECT * FROM Clock WHERE clockDate = GETDATE() AND userName = @userName)
BEGIN
UPDATE Clock SET breakOut = GETDATE()
WHERE clockDate = GETDATE() AND userName = @userName
END
ELSE
BEGIN
INSERT INTO Clock (clockDate, userName, breakOut)
VALUES (GETDATE(), @userName, GETDATE())
END
ここに私の問題があります...ユーザーがその日にクロックインすると、ストアドプロシージャがまだINSERT
ステートメントの一部を実行しようとしていて、UPDATE
行を実行しないため、主キー違反が発生します。IF NOT EXISTS
同じ結果で同様に反転させてみました。ストアド プロシージャで IF-ELSE を機能させるための秘訣は何ですか? これは私が考えている方法で行うことができますか、Merge
それともステートメントを研究する必要がありますか? 私の計画は、各ワークステーションで単純な Visual Basic プログラムからストアド プロシージャを実行することです。多分私は私の頭の中に入っています :( 残念なことに、私の上司はあまりにも安すぎて、タイムレコーダーソリューションを購入することはできません!
編集:
助けてくれてありがとう!私はこのサイトに恋をしています。質問はとても速く答えを得ます!!! これが私の作業ストアドプロシージャです:
ALTER PROCEDURE dbo.BreakOut
(
@userName varchar(50)
)
AS
IF EXISTS (SELECT * FROM Clock WHERE DateDiff(dd, GetDate(),clockDate) = 0 AND userName = @userName)
BEGIN
UPDATE Clock SET breakOut = GETDATE()
WHERE DateDiff(dd, GetDate(),clockDate) = 0 AND userName = @userName
END
ELSE
BEGIN
INSERT INTO Clock (clockDate, userName, breakOut)
VALUES (GETDATE(), @userName, GETDATE())
END
これは適切ですか、それとももっと改善できますか? もう一度ありがとうございました!!!