好的。我得到了很多帮助here https://stackoverflow.com/questions/11906506/sql-server-2008-if-not-exists-insert-else-update之前使用 SQL 后端来实现简单的...只是不适合我:(...适用于我工作的小型办公室的时钟解决方案,所以我回来寻求更多!
我当前正在使用的表由 6 列组成:
- ClockDate日期不为空PK
- 用户名 varchar(50) 不为空 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 程序运行存储过程。也许我有点不知所措:(可惜我的老板太便宜了,不能只买一个时钟解决方案!
EDIT:
感谢大家的帮助!!我爱上了这个网站,问题很快就能得到答案!这是我的工作存储过程:
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
这样是否合适,或者是否可以进一步改进?再次非常感谢大家!!!