OK。我得到了很多帮助here早些时候与SQL后端工作到一个简单的...只是不适合我:(...我工作的小型办公室的时钟解决方案,所以我回来了更多!SQL存储过程IF EXISTS UPDATE ELSE INSERT
我的表,我目前正与包括6列:
- clockDate日期不为空PK
- userName的VARCHAR(50)NOT NULL PK
- clockIn时间(0)
- 突破时间( 0)
- breakIn time (0)
- 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
这里是我的问题......如果用户在这一天,我收到了主键冲突,因为该存储过程仍在试图运行该语句的INSERT
部分DID时钟并且从不运行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(),因为这是现在,当它返回的时候,太!您想要做的是查看该日期是否存在该用户的记录。 – dash 2012-08-10 23:04:27
谢谢你@dash! – tmhalbert 2012-08-10 23:12:43