2014-03-03 16 views
0

即时通讯尝试为我的预订应用程序创建一个存储过程,该应用程序检查当前假期的状态,然后决定在存储过程运行后要将状态更改为何种情况,这是我的代码,我试图绘制来自Holidays表的状态,但我不知道如何处理,而不是通过它传递它,虽然我的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

即使你*想*你的'@ Status'参数的长度为1,我怀疑在这种情况下,通常最好为所有'varchar'声明包含一个显式长度后来的读者,你想要'varchar(1)')。然而,在这种情况下,我认为这是一个错误,你不希望它的长度为1,因为比较如'@Status ='ManagerAcc''。 –

回答

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)变量或列,因为:

如果没有在数据定义或变量声明语句中指定ñ,则默认长度为1

你很少,如果有的话,实际上是希望有一个varchar(1)变量。

Ñ使用CASTCONVERT功能当未指定,则缺省长度是30

这是一个稍微更有用的数据类型,但是恼人的只是因为有不似乎是在不同情况下为n设置不同默认值的好理由。

+0

非常感谢!工作完美,比我原来的更好:) –

相关问题