case when遇上null值

iSQlServer發表於2009-10-16

利用儲存過程對錶中記錄進行update,是很常見,也很容易的,但是如果更新的表有欄位是允許null的、需要對是否為null做不同處理,同時該儲存過程的執行命令是用sp_executesql,你會怎麼處理呢,相信很多人第一時間想到的也是在update語句裡用case when吧。如果你也是這樣想,並這麼做的話,相信你肯定鬱悶的發現:

1、case when判斷null值,得到相反的結果,只有是常量值的情形,執行時正常的;

2、sql server對拼接的字串形式的sql語句中的錯誤,不提示錯誤資訊,除了罷工

 

case when的執行結果跟我們預期的相反。請見如下指令碼:
另外發現,sql  server裡對拼接得到的字串sql語句裡面的錯誤,不做如何報錯提示,僅僅是來個不理不問,無任何反映。此次case when不能正常執行null值的情況,就是我一段一段拼接的sql字串註釋後,檢測出來的,汗~~。在這提供一個可用的檢測語句print cash null when null then ‘null’ else ‘not null’ end)

--@Birthday=null

declare @sql nvarchar(2000)
declare @dbName nvarchar(50)

 

if exists(select 1 from syscfg where   isTestDB='' or isTestDB is null)
begin
    --live dataBase
    set @dbName=’dbLive’
end
else   
begin
    --test dataBase
    set @dbName='dbTest'
end

set @sql='update '+@dbName+'.dbo.PathologyHead set '     
            ----patient部分
               +' Birthday='+case @Birthday when null then 'null,' else ''''+cast(@Birthday as nvarchar(20))+''',' end  
              +' IsHKID='+case @IsHKID when 1 then '1' else '0' end+','
            +' IDType='+cast(@IDType as nvarchar(5))         
             +' where LabNumber='''+@LabNumber+''''
--print @sql
exec sp_executesql @sql

 

上面的對欄位IsHKID的執行卻是正常的,難道case when是得對非null的值才行?我將@Birthday值的是否為null,移到前面判斷,執行正常,修改後的如下

 

set @Birthday=isnull(@Birthday,'1910-10-1') --移到下面的update中處理

 

set @sql='update '+@dbName+'.dbo.PathologyHead set '     
            ----patient部分
               +' Birthday='+case @Birthday when '1910-10-1' then 'null,' else ''''+cast(@Birthday as nvarchar(20))+''',' end  
              +' IsHKID='+case @IsHKID when 1 then '1' else '0' end+','
            +' IDType='+cast(@IDType as nvarchar(5))         
             +' where LabNumber='''+@LabNumber+''''
--print @sql
exec sp_executesql @sql

原文地址:http://www.cnblogs.com/hyqiang168/archive/2009/10/16/1584424.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616718/,如需轉載,請註明出處,否則將追究法律責任。

相關文章