如何将存储过程中的变量设置为另一个表中的值?

时间:2014-03-03 11:17:24

标签: sql sql-server stored-procedures

我试图为我的预订应用程序创建一个存储过程,检查当前假日的状态,然后决定在运行存储过程后将状态更改为什么,这是我的代码,我正在尝试绘制来自假期表的状态,但除了通过我的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

1 个答案:

答案 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)变量。

  

使用CASTCONVERT函数时未指定 n 时,默认长度为30

这是一种稍微有用的数据类型,但是因为在不同的上下文中n具有不同的默认值似乎没有充分的理由而烦人。