小编典典

SQL存储过程IF EXISTS UPDATE ELSE INSERT

sql

好的。在此之前,我在使用SQL后端到简单的工作中获得了很多帮助……只是不适合我:(
…适用于我工作的小型办公室的时钟解决方案,所以我回来了!

我目前使用的表格包含6列:

  1. clockDate日期不为空PK
  2. userName varchar(50)不为null PK
  3. clockIn时间(0)
  4. 突破时间(0)
  5. 闯入时间(0)
  6. clockOut时间(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

这是适当的,还是可以进一步改进?再次非常感谢你们!!!


阅读 266

收藏
2021-05-16

共1个答案

小编典典

这可能是这里的问题:WHERE clockDate = GETDATE()

GetDate返回当前日期和当前时间,这与clockDate不匹配。您可以将日期与DateDiff进行比较:

WHERE DateDiff(dd, GetDate(),clockDate) = 0
2021-05-16