OK。我得到了很多幫助here早些時候與SQL後端工作到一個簡單的...只是不適合我:(...我工作的小型辦公室的時鐘解決方案,所以我回來了更多!SQL存儲過程IF EXISTS UPDATE ELSE INSERT
我的表,我目前正與包括6列:
- clockDate日期不爲空PK
- userName的VARCHAR(50)NOT NULL PK
- clockIn時間(0)
- 突破時間( 0)
- breakIn time (0)
- CLOCKOUT時間(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
部分DID時鐘並且從不運行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
這是正確的,或可能是進一步提高再次感謝大家這麼多!
這是你的IF語句 - 不會有存在的記錄與時間GETDATE(),因爲這是現在,當它返回的時候,太!您想要做的是查看該日期是否存在該用戶的記錄。 – dash 2012-08-10 23:04:27
謝謝你@dash! – tmhalbert 2012-08-10 23:12:43