繁体   English   中英

SQL存储过程IF EXISTS UPDATE ELSE INSERT

[英]SQL stored procedure IF EXISTS UPDATE ELSE INSERT

好。 早些时候得到了很多帮助,使用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

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

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

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

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

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

您的问题似乎如下:

让我们假设用户在09:00进入

可能存在以下记录:

ClockDate    userName    clockIn    breakOut    breakIn    clockOut
12/08/2012   joe         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)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM