2016-07-23 127 views
0

我在SQL Server中創建了用戶定義的函數,但不知何故邏輯不正確,它總是執行else語句;請幫忙!SQL Server if else語句無法正常工作

CREATE FUNCTION shipSelection 
    (@Item_No varchar(20),@itemname varchar(20)) 
RETURNS varchar(100) 
AS 
BEGIN 
    declare @weight float 
    declare @demention float 
    declare @density float 
    declare @result varchar(100) 

    SET @weight = (SELECT Item_Weight FROM Items 
        WHERE Item_No = @Item_No AND Name = @itemname) 
    SET @demention = (SELECT Dimention FROM Items 
         WHERE Item_No = @Item_No AND Name = @itemname) 

    SELECT @density = @weight/@demention 

    IF @density > 100 
    BEGIN 
     SET @result = 'LOW DENSITY CAN USE ANY TYPE SHIPS'; 
    END 
    ELSE IF @density > 300 
    BEGIN 
     SET @result = 'MEDIUM DENSITY CAN USE MEDIUM SHIPS'; 
    END 
    ELSE IF @density > 500 
    BEGIN 
     SET @result = 'MEDIUM DENSITY WANT TO USE HUGE SHIPS'; 
    END 
    ELSE 
    BEGIN 
     SET @result = 'DONT WANT TO CARE ABOUT SHIPS TOO SMALL DENSITY ITEM'; 
    END 

    RETURN @result 
END 

SELECT 
    dbo.shipSelection('I010', 'asus x555l') AS TRANSPORT_SHIP_TYPE 
+0

你能證明你正在尋找了,請 – Mike

+0

我建議你添加一些調試代碼選擇的全程記錄顯示結果,當你填充尺寸和重量 – Mike

+0

那是,我如何傳遞值的記錄功能 –

回答

4

你有邏輯的方式,它總是會打任第一種情況下(> 100),或其他(< 100)。嘗試先查看最大的數字。

它不會遇到> 300的情況,因爲它會首先使用> 100的情況。

如果您總是碰到else語句,那麼您需要檢查您的值是否實際上大於100.聽起來並非如此。

+0

非常感謝你,現在它工作完美!!!!!!! –

+0

感謝您回覆我們,它解決了您的問題。習慣上接受正確的答案(@PhillipXT),這樣他才能獲得信用,並幫助將來遇到類似問題的用戶找到正確的答案。 – Mike

1

我敢打賭,你的一個查詢返回一個NULL值。由於null不是一個數字,不能與一個數字和你的else語句進行比較,如果爲null,將會被命中。您可以通過使用COALESCE將查詢返回null值設置爲已知值來防止此問題。

SET @weight = (SELECT COALESCE(Item_Weight,0) FROM Items 
        WHERE Item_No = @Item_No AND Name = @itemname) 
    SET @demention = (SELECT COALESCE(Dimention,0) FROM Items 
         WHERE Item_No = @Item_No AND Name = @itemname) 
+0

demention變量可能應該默認爲1,因爲之後他正在對它進行分割。 – PhillipXT

+0

個人而言,我更喜歡使用CASE語句檢查除零條件,而不是使用COALESCE設置值。如果在分割後使用@demention,那麼你需要保持精神狀態爲1而不是零。只是我的兩分錢。 –

+0

SELECT @ a = CASE WHEN @ c = 0 THEN 0 ELSE @ b/@c END ...但是你沒有錯,我不是對的:) –