好.我早些时候已经得到了很多的帮助
here使用sql后端到一个简单的…只是不为我(…时钟解决方案为我办公室的小办公室,所以我回来更多!
我目前正在使用的表包括6列:
> clockDate date not null PK
> userName varchar(50)not null PK
>时钟(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
这是我的问题…如果用户DID时钟在一天我得到主键违规,因为存储过程仍然尝试运行语句的INSERT部分,并且永远不会运行UPDATE行.我试过它与一个IF不存在一样翻转同样的结果. IF-ELSE在存储过程中工作的诀窍是什么?可以这样做吗,我在想,还是要研究合并声明?我的计划是从每个工作站上的简单Visual Basic程序运行存储过程.也许我会在我的头上(为了坏我的老板太便宜,只是买一个时钟解决方案!
编辑:
感谢大家的帮助!!我爱上了这个网站,问题得到答案SO FAST !!!这是我的工作存储过程:
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,clockDate) = 0 AND userName = @userName END ELSE BEGIN INSERT INTO Clock (clockDate,GETDATE()) END
这是正确的,还是可以改进?再次感谢所有这么多!
解决方法
这可能是在这里的问题:WHERE clockDate = GETDATE()
GetDate返回当前日期AND当前时间,这与clockDate不匹配.您可以将日期与DateDiff进行比较:
WHERE DateDiff(dd,clockDate) = 0