好的。在此之前,我在使用SQL后端到简单的工作中获得了很多帮助……只是不适合我:( …适用于我工作的小型办公室的时钟解决方案,所以我回来了!
我目前使用的表格包含6列:
尽管我已经IF NOT EXISTS INSERT ELSE UPDATE从上一个问题中弄清楚了我的陈述,但是现在我试图在存储过程而不是简单的查询窗口中使用它,但没有成功。
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程序运行存储过程。也许我烦恼了:(不好意思,我的老板太便宜了,不能只买一个时钟解决方案!
INSERT
UPDATE
IF NOT EXISTS
Merge
编辑:
谢谢大家的帮助!!我爱上了这个网站,问题得到的答案如此之快!!!这是我的工作存储过程:
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
这是适当的,还是可以进一步改进?再次非常感谢你们!!!
这可能是这里的问题:WHERE clockDate = GETDATE()
GetDate返回当前日期和当前时间,这与clockDate不匹配。您可以将日期与DateDiff进行比较:
WHERE DateDiff(dd, GetDate(),clockDate) = 0