行。我有很多帮助here之前使用SQL后端处理一个简单的...只是不适合我:( ...我工作的小型办公室的时钟解决方案,所以我回来了更多!
我目前正在使用的表格由6列组成:
我虽然从上一个问题中找出了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
部分而从不运行{{1行。我尝试用UPDATE
翻转同样的结果。让IF-ELSE在存储过程中工作的诀窍是什么?这可以通过我正在思考的方式完成,还是我必须研究IF NOT EXISTS
声明?我的计划是从每个工作站上的简单Visual Basic程序运行存储过程。也许我已经陷入了困境:(对我的老板来说太糟糕了,只买一个时钟解决方案!
修改
谢谢大家的帮助!!我爱上这个网站,问题得到答案很快!这是我的工作存储过程:
Merge
这是正确的,还是可以进一步改进?再次非常感谢你!!!
答案 0 :(得分:11)
这可能就是问题所在:WHERE clockDate = GETDATE()
GetDate返回当前日期和当前时间,这与clockDate不匹配。您可以将日期与DateDiff进行比较:
WHERE DateDiff(dd, GetDate(),clockDate) = 0
答案 1 :(得分:3)
您的问题似乎如下:
让我们假设用户在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)
答案 2 :(得分:1)
您的更新永远不会投放,因为GETDATE
会返回日期和时间。
答案 3 :(得分:0)
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