SQL存储过程(如果存在)更新ELSE INSERT

SQL存储过程(如果存在)更新ELSE INSERT,sql,stored-procedures,if-statement,Sql,Stored Procedures,If Statement,嗯。我得到了很多帮助早期工作与SQL后端到一个简单的。。。只是不适合我:(…我工作的小办公室的时钟解决方案,所以我回来要更多 我当前使用的表由6列组成: clockDate日期不为空PK 用户名varchar(50)非空PK 计时时间(0) 突破时间(0) 磨合时间(0) 时钟停止时间(0) 我想我已经从上一个问题中找到了我的IF NOT EXISTS INSERT ELSE UPDATE语句,但现在我尝试在存储过程中使用它,而不是在普通的查询窗口中使用它,但没有成功 基本上,用户打卡是不需要动

嗯。我得到了很多帮助早期工作与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
    
    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
    
    这是我的问题…如果用户确实在我收到主键冲突的那天打卡,因为存储过程仍在尝试运行语句的
    INSERT
    部分,并且从未运行
    UPDATE
    行。我尝试过使用
    If NOT EXISTS
    翻转它,结果也是一样的。获得If-E的诀窍是什么LSE在存储过程中工作?这可以按我的想法完成吗?还是我必须学习
    Merge
    语句?我的计划是从每个工作站上的一个简单Visual Basic程序运行存储过程。也许我是在胡思乱想:(糟糕的是,我的老板太便宜了,不能只买一个时钟解决方案

    编辑:

    谢谢大家的帮助!!我爱上了这个网站,问题很快就能得到答案!!!这是我的工作存储过程:

    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
    
    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
    

    您的更新将永远不会运行,因为
    GETDATE
    返回日期和时间


    您的问题可能是:

    让我们假设用户在09:00打卡

    可能存在以下类似的记录:

    ClockDate userName clockIn breakOut breakIn clockOut 12/08/2012 joe 09:00 NULL NULL NULL i、 这个记录不存在

    相反,请尝试以下方法:

    IF EXISTS (SELECT * FROM Clock  WHERE clockDate = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE())) AND userName = @userName)
    
    您还需要确保将clockDate存储为GETDATE()的日期部分,否则,您需要如下调整查询:

    IF EXISTS (SELECT * FROM Clock WHERE DATEADD(D, 0, DATEDIFF(D, 0, clockDate)) = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE())) AND userName = @userName)
    

    这是您的IF语句-不存在带有time GETDATE()的记录因为那是现在,因为它也会返回时间!你要做的是查看该用户在该日期是否已经存在记录。我会将此标记为答案,但我没有声誉,抱歉!但谢谢!当我到达下个月的这一天时,这会是个问题吗?还是否?dd是指日期字符串中的日期部分?你可以你可以选择其中任何一个。只是检查一下,确保它们是同一天。我喜欢你打破它的方式,谢谢!!