2016-07-23 128 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 ...但是你没有错,我不是对的:) –