2014-03-03 34 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

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

相關問題