在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