好的。早些时候,我在这里得到了很多帮助,将 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
这是我的问题...如果用户 DID 当天打卡我得到主键违规,因为存储过程仍在尝试运行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
这是正确的,还是可以进一步改进?再次感谢你们!