CASE语句在我的存储过程中给出了错误的结果

时间:2014-06-12 14:06:42

标签: sql sql-server stored-procedures case

我在执行数据之前使用的存储过程中有一个案例。

DECLARE @Setup nvarchar(50)

SELECT 
   @ZipCode = CASE 
                 WHEN REPLACE(@ZipCode, '0', '') = '' 
                   THEN NULL ELSE @ZipCode 
              END,
   @ZipCodeEND = CASE 
                   WHEN REPLACE(@ZipCodeEND, '0', '') = '' 
                     THEN NULL ELSE @ZipCodeEND 
                 END, 

SELECT
    @Setup = CASE WHEN (LEN(ISNULL(@ZipCode, ''))) > 0 THEN '1' ELSE '0' END +
             CASE WHEN (LEN(ISNULL(@ZipCodeEND,''))) > 0 THEN '1' ELSE '0' END

IF ISNULL(@ID, 0) = 0 
BEGIN
   INSERT INTO dbo.MapToStaticValuesTable(ZipCode, ZipCodeEND, Setup)
   VALUES(@ZipCode, @ZipCodeEND, @Setup)
END

这里的问题是即使zipcode和zipcodeEnd为空并且在保存到表中后设置为null我仍然得到值“11”而不是获得“00”。

现在,如果我使用nvarchar值执行相同的示例,它会起作用,但由于ZipCodeZipCodeEnd设置为int,因此行为很奇怪。

1 个答案:

答案 0 :(得分:3)

它表现得很奇怪,因为你在整数上使用字符串函数。不确定您要使用代码实现什么,但我确信只需将值检查为整数即可完成。

我想这可能就是你要找的东西。

select case when nullif(@ZipCode, 0) is null then '0' else '1' end +
       case when nullif(@ZipCodeEND, 0) is null then '0' else '1' end

奇怪的一个例子

select isNull(@ZipCode, '') 
如果0@ZipCode,则

返回null