【问题标题】:SQL stored procedure IF EXISTS UPDATE ELSE INSERTSQL 存储过程 IF EXISTS UPDATE ELSE INSERT
【发布时间】:2012-08-08 06:21:06
【问题描述】:

好的。我得到了很多帮助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

这是我的问题...如果用户 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

这是正确的,还是可以进一步改进?再次感谢大家!!!

【问题讨论】:

  • 这是你的 IF 语句 - 不会存在时间 GETDATE() 的记录,因为那是现在,因为它也返回时间!您要做的是查看该用户在该日期是否已经存在记录。

标签: sql stored-procedures if-statement


【解决方案1】:

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

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

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

【讨论】:

  • 我会将此标记为答案,但我没有声誉,对不起!但是谢谢你!!!!!!!
  • 下个月到今天这会不会是个问题,还是不会? 'dd' 是指日期字符串的日期部分吗?
  • 你可以使用任何一个。它只是检查以确保它们是同一天。
【解决方案2】:

您的问题可能如下:

假设用户在 09:00 打卡

可能存在如下记录:

ClockDate 用户名 clockIn breakOut breakIn clockOut 12/08/2012 乔 09:00 NULL NULL NULL

现在您的 IF 语句正在执行此操作:

SELECT * FROM Clock WHERE clockDate = "20120812 17:24:13" AND userName = @userName

即这条记录不会存在。

试试这个:

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)

【讨论】:

  • 喜欢你打破它的方式,谢谢!!
【解决方案3】:

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

http://msdn.microsoft.com/en-us/library/ms188383.aspx

【讨论】:

    【解决方案4】:
    CREATE PROCEDURE `SP_GENRE_SELECT`(
        IN _Id INTEGER,
          IN _Name VARCHAR(50),
          IN _account VARCHAR (50),
          IN _Password VARCHAR (50),
          IN _LastConnexionDate DATETIME,
          IN _CreatedDate DATETIME,
          IN _UpdatedDate DATETIME,
          IN _CreatedUserId INTEGER,
          IN _UpdatedUserId INTEGER,
          IN _Status TINYINT
        )
    BEGIN
          SELECT *
          FROM user
          WHERE Id LIKE IF(_Id IS NULL,'%',CAST(_Id AS VARCHAR(50)))
          AND
          Name LIKE IF(_Name IS NULL,'%',CONCAT('%',_Name,'%'))
          AND
          Account LIKE IF(_Account IS NULL,'%',CONCAT('%',_Account,'%'))
          AND
          LastConnexionDate LIKE IF(_LastConnexionDate IS NULL,'%',CONCAT('%',CAST(LastConnexionDate AS VARCHAR(50),'%')))
          AND
          CreatedDate LIKE IF(_CreatedDate IS NULL,'%',CONCAT('%',CAST(_CreatedDate AS VARCHAR(50),'%')))
          AND
          UpdatedDate LIKE IF(_UpdatedDate IS NULL,'%',CONCAT('%',CAST(_UpdatedDate AS VARCHAR(50),'%')))
          AND
          CreatedUserID LIKE IF(_CreatedUserID IS NULL,'%',CONCAT('%',CAST(_CreatedUserID AS VARCHAR(50),'%')))
          AND
          UpdatedUserID LIKE IF(_UpdatedUserID IS NULL,'%',CONCAT('%',CAST(_UpdatedUserID AS VARCHAR(50),'%')))
          AND
          Status LIKE IF(_Status IS NULL,'%',CAST(_Status AS VARCHAR(50),'%'))
    
    END
    

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      相关资源
      最近更新 更多