利用存儲過程對表中記錄進行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/