在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