现在的位置: 首页 > 综合 > 正文

SQL Server中 NULL数据概述

2013年09月22日 ⁄ 综合 ⁄ 共 1629字 ⁄ 字号 评论关闭

在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

 

抱歉!评论已关闭.