【发布时间】:2012-08-08 06:21:06
【问题描述】:
好的。我得到了很多帮助here 之前使用 SQL 后端进行简单的工作......只是不适合我:(......我工作的小型办公室的时钟解决方案,所以我回来了!
我目前正在使用的表格包含 6 列:
- clockDate 日期不为空 PK
- userName varchar(50) not 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
这是我的问题...如果用户 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
这是正确的,还是可以进一步改进?再次感谢大家!!!
【问题讨论】:
-
这是你的 IF 语句 - 不会存在时间 GETDATE() 的记录,因为那是现在,因为它也返回时间!您要做的是查看该用户在该日期是否已经存在记录。
标签: sql stored-procedures if-statement