1

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

不幸的是,由于用户界面错误,一些值'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))
4

2 回答 2

2

您缺少varchar参数的长度:

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

如果您不输入长度,则该值的长度将不等于 1,none因此它将返回d。请参阅SQL Fiddle with Demo的两个不同版本的函数。

于 2013-04-29T00:08:25.237 回答
0

在线书籍:

varchar [ ( n | max ) ]

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

尝试:

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


-- Remark 2:
select cast(1.2345678901234567890123456789 as varchar)
于 2013-04-29T00:53:49.623 回答