在Sql Server中当用户比较函数或数据函数中时, NULL可能会存在些问题,能够导致无法预测的结果. 首先说下NULL和数学 1 如果NULL出现在任何SQL数学中,则结果总是NULL. 下面演示一个实例 . 查询三个表的数据,并且要求卡号是UserID= 2, 还是未结账状态的.并且将得到的数据相加 下面是存储过程中的事务代码 ALTERPROCEDURE[dbo].[PROC_CheckBill] -- Add the parameters for the stored procedure here @userIDvarchar(15) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SETNOCOUNTON; beginTran--开始事务 selectCOUNT(cardID)as'售卡张数'fromT_StudentInfowhereuserID=@userIDandidentify='未结账' selectCOUNT(cardID)as'退卡张数',COALESCE(sum(cancelCash),0)as'退卡金额'fromT_CancelwhereuserID=@userIDandstatue='未结账' selectcoalesce(sum(addMoney),0)as'充值金额'fromT_Rechargewhere userID =@userIDandstatue='未结账' updateT_StudentInfo setidentify='已结账'whereuserID=@userIDandidentify='未结账' updateT_Cancelsetstatue ='已结账'whereuserID=@userIDandstatue='未结账' updateT_Rechargesetstatue ='已结账'whereuserID=@userIDandstatue='未结账' declare@RegionErrorint select@RegionError=@@ERROR--每执行完一条t-sql语句马上进行检测,并把错误号保存到局部变量中 if (@RegionError =0) --判断如果两条语句都执行成功 commitTran--执行事务 else ROLLBACKTran--回滚事务 END 想象一个下,我们查询充值金额,如果查到的数据是0 或具体的数字,那么它相加后返回的结果也应该是0或具体数字才对 呢. 而实际得到的结果却不是我们想要的
执行存储过充后
我们看到执行后充值金额的返回值是NULL,这个值是无法进行数学相加的。 这就是NUlL表示的未知数据,而不是任意特定值 因此我们要特别注意NULL的处理,尤其是在数学中。确保返回的值不是NULL。为了解决这个问题,可以选择过滤到NULL结果。或是使用一个函数将NULL值改为最终用户能理解的东西。 这里COALESCE()函数就是很好的作用 COALESCE :返回其参数中第一个非空表达式。 语法 COALESCE ( expression [ ,...n ] ) 参数 expression 任何类型的表达式。 n 表示可以指定多个表达式的占位符。所有表达式必须是相同类型,或者可以隐性转换为相同的类型。 返回类型 将相同的值作为 expression返回。 注释 如果所有自变量均为 NULL,则 COALESCE返回 NULL值 所以以上的错误修改方式是在求和前加上这个函数 select coalesce(sum(addMoney),0) as '充值金额' from T_Recharge where userID =@userID and statue ='未结账'
到这里这个问题就完成解决了。下篇博客继续讲述NULL的用法,再述NULL
|