SQL存储过程IF EXISTS UPDATE ELSE INSERT

tmh*_*ert 17 sql stored-procedures if-statement

好.我早些时候得到了很多帮助,使用SQL后端来处理一个简单的...只是不适合我:( ...我工作的小办公室的时钟解决方案,所以我回来了!

我目前正在使用的表格由6列组成:

  1. clockDate date not null PK
  2. userName varchar(50)not null PK
  3. clockIn time(0)
  4. breakOut时间(0)
  5. breakIn time(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
Run Code Online (Sandbox Code Playgroud)

这是我的问题...如果用户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
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*Jim 11

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

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

WHERE DateDiff(dd, GetDate(),clockDate) = 0
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用任何一个.它只是检查以确保它们是同一天. (2认同)