我试图为我的预订应用程序创建一个存储过程,检查当前假日的状态,然后决定在运行存储过程后将状态更改为什么,这是我的代码,我正在尝试绘制来自假期表的状态,但除了通过我的html连接传递它之外,我不知道该怎么办。
这是我到目前为止的SQL存储过程,如果我可以从假期表中获取状态,我可以完成它并且它将正常工作:(我对SQL也很新,所以尽量不要太复杂了谢谢:))
CREATE PROCEDURE [dbo].[spHolidayApproveOrDecline]
(
@JobRole INT,
@HolidayID INT,
@Status varchar
)
AS
BEGIN
SET @Status AS
(这是我需要设定的地方 作为假期表的价值!!!!)
IF @JobRole = '1003'
BEGIN
SELECT * FROM Holidays WHERE @HolidayID = Holidays.ID
IF @Status = 'Pending'
BEGIN
UPDATE Holidays
SET Status = 'ManagerAcc'
WHERE @HolidayID = Holidays.ID
AND Status = 'Pending'
END
IF @Status = 'AdminAcc'
BEGIN
UPDATE Holidays
SET Status = 'Accepted'
WHERE @HolidayID = Holidays.ID
AND Status = 'AdminAcc'
END
END
IF @JobRole = '1002'
BEGIN
SELECT * FROM Holidays WHERE @HolidayID = Holidays.ID
IF @Status = 'Pending'
BEGIN
UPDATE Holidays
SET Status = 'AdminAcc'
WHERE @HolidayID = Holidays.ID
AND Status = 'Pending'
END
IF @Status = 'ManagerAcc'
BEGIN
UPDATE Holidays
SET Status = 'Accepted'
WHERE @HolidayID = Holidays.ID
AND Status = 'ManagerAcc'
END
END
END
答案 0 :(得分:0)
我认为您的整个过程可以替换为单个UPDATE
:
UPDATE Holidays
SET Status = CASE
WHEN @JobRole = 1003 and Status = 'Pending' THEN 'ManagerAcc'
WHEN @JobRole = 1003 and Status = 'AdminAcc' THEN 'Accepted'
WHEN @JobRole = 1002 and Status = 'Pending' THEN 'AdminAcc'
WHEN @JobRole = 1002 and Status = 'ManagerAcc' THEN 'Accepted'
ELSE Status END
WHERE @HolidayID = Holidays.ID
如果您希望呼叫者可以使用@Status
,则该参数需要声明为OUTPUT
,而当前不是,所以我不会进行实际的扩展设置@Status
变量,因为它似乎没必要。
通常,您应该在SQL中找到告诉系统要做什么的方法,而不是如何做。你不应该想,好吧,首先我将提取当前状态。然后,根据当前状态和工作角色,我将应用特定更新。告诉系统具体条件是什么,并让它确定处理的顺序。
每当指定varchar(n)
变量或列时,您也应该非常小心,因为:
如果未在数据定义或变量声明语句中指定 n ,则默认长度为1.
你很少,如果有的话,实际上想要一个varchar(1)
变量。
使用
CAST
和CONVERT
函数时未指定 n 时,默认长度为30
这是一种稍微有用的数据类型,但是因为在不同的上下文中n
具有不同的默认值似乎没有充分的理由而烦人。