我有一个过程,它将表中的值映射到报表的逗号连接字符串。
不幸的是,由于用户界面错误,某些值为'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))
答案 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)