gpt4 book ai didi

SQL 存储过程 IF EXISTS UPDATE ELSE INSERT

转载 作者:行者123 更新时间:2023-12-02 07:38:23 24 4
gpt4 key购买 nike

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

我当前使用的表格由 6 列组成:

  1. clockDate日期不为空PK
  2. userName varchar(50) not null PK
  3. 打卡时间(0)
  4. 突破时间(0)
  5. 磨合时间(0)
  6. 下类时间(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

这是我的问题...如果用户当天确实签到了,我会遇到主键冲突,因为存储过程仍在尝试运行语句的 INSERT 部分,并且从未运行更新行。我尝试用 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

这样是否合适,或者可以进一步改进吗?再次非常感谢大家!!!

最佳答案

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

GetDate 返回当前日期和当前时间,与clockDate 不匹配。您可以使用 DateDiff 来比较日期:

WHERE DateDiff(dd, GetDate(),clockDate) = 0

关于SQL 存储过程 IF EXISTS UPDATE ELSE INSERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11910286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com