好的,我之前在 这里 得到了很多帮助,用于处理一个简单的时间记录系统,但对于我来说它仍然不太行,所以我需要更多的帮助。
我目前正在处理的表包含 6 个列:
- clockDate date not null PK
- userName varchar(50) not null PK
- clockIn time(0)
- breakOut time(0)
- breakIn time(0)
- clockOut time(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
这样合适吗?还能更加改进吗?再次非常感谢大家!!!