SQL存储过程IF EXISTS UPDATE ELSE INSERT

前端之家收集整理的这篇文章主要介绍了SQL存储过程IF EXISTS UPDATE ELSE INSERT前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好.我早些时候已经得到了很多的帮助 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

猜你在找的MsSQL相关文章