SQL Server 2008:IF语句未按预期工作

时间:2013-04-29 00:01:14

标签: sql-server-2008

我有一个过程,它将表中的值映射到报表的逗号连接字符串。

不幸的是,由于用户界面错误,某些值为'none'而不是null。我很确定'none'值只是一个字符串,所以我的程序试图像这样处理它。

如果遇到'none',程序应该不返回任何内容,但事实并非如此。例如,如果我将'none'传递给下面的@DrugUse,则应该不返回任何内容,对吧?但它仍会返回'd'。那么我做错了什么?

ALTER FUNCTION [dbo].[MapConsumerAdvice] 
(
    @AdultThemes as VarChar,
    @DrugUse as VarChar
)
RETURNS VarChar(20)
AS
BEGIN
    DECLARE @Result as VarChar(999)

    SET @Result = ''

    IF (@AdultThemes > 0) 
       SET @Result = ',' + 'a'

    IF (@DrugUse IS NOT NULL) AND (@DrugUse != 'none') 
        SET @Result = @Result + ',' + 'd'

    RETURN SUBSTRING(@Result, 2, LEN(@Result))

2 个答案:

答案 0 :(得分:2)

参数的varchar缺少长度:

create FUNCTION [dbo].[MapConsumerAdvice_version2] 
(
    @AdultThemes as VarChar(10),
    @DrugUse as VarChar(10)
)

如果你没有设置长度,那么该值的长度将不等于none,因此它将返回d。请参阅该功能的两个不同版本的SQL Fiddle with Demo

答案 1 :(得分:0)

联机丛书:

  

varchar [(n | max)]

     

在数据定义或变量声明中未指定n时   声明,默认长度为1.使用时未指定n   CAST和CONVERT函数,默认长度为30。

尝试:

-- Remark 1:
declare @a varchar = 'abcd'
select @a, len(@a)


-- Remark 2:
select cast(1.2345678901234567890123456789 as varchar)