SQL Server中 NULL数据概述

在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

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值