tmh*_*ert 17 sql stored-procedures if-statement
好.我在早些时候得到了很多帮助,使用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
Run Code Online (Sandbox Code Playgroud)
这是我的问题...如果用户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
Run Code Online (Sandbox Code Playgroud)
这是正确的,还是可以进一步改进?再次非常感谢你!
Jim*_*Jim 11
这可能是这里的问题:WHERE clockDate = GETDATE()
GetDate返回当前日期和当前时间,这与clockDate不匹配.您可以将日期与DateDiff进行比较:
WHERE DateDiff(dd, GetDate(),clockDate) = 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76562 次 |
| 最近记录: |