今天測試一段代碼.其中有一個邏輯是,有一個表,這個表有ID和Value兩個欄位,現嘗試從這個表取某個ID的最大value值,若存在記錄,則返回此最大值,若不存在,則插入一條新值.代碼邏輯大致如下:
DECLARE @max INTSELECT @max=0SELECT @Max = MAX(Filed1)FROM Table1IF @@Rowcount = 0 --判斷資料是否存在 BEGIN set @max=1000 INSERT INTO table1 (id, field1 ) VALUES (1, @max) RETURN @max ENDELSE BEGIN RETURN @max END
我首先將Table1表清空,執行上述代碼,返回的結果竟然總是0!
測了許久,居然發現上面的@@Rowcount一直是1!
Table1表不是沒資料麼?為什麼@@rowcount會是1呢!
我把Select語句中的Max去掉@@Rowcount就返回0了.
仔細思考了一下:
原來彙總函式對空表進行彙總時,會返回NULL!而NULL也是一行資料.
若不用彙總函式,就啥也不返回,連NULL也沒有.這時@@Rowcount為0
而解決辦法就是加上group by子句.
SELECT MAX(cmc.MaxNumber) FROM Coupons_MaxCode cmc WHERE cmc.CouponsCode='1007'GROUP BY cmc.CouponsCodeSELECT @@ROWCOUNTDECLARE @max INTSELECT @max=0SELECT @Max = MAX(Filed1)FROM Table1GROUP BY idIF @@Rowcount = 0 BEGIN set @max=1000 INSERT INTO table1 ( id,field1 ) VALUES (1,@max ) RETURN @max ENDELSE BEGIN RETURN @max END
問題解決後,又讓我想起一個很容易因空表引起錯誤的地方,如下:
DECLARE @s INTSET @s=10SELECT @s=VALUE FROM table1WHERE 1=2PRINT @s
此時輸出的@S是多少?
很多人一開始認為輸出@s值為NULL,因為Where 1=2永不成立.
但實際是,最終@S輸出10,因為Where 1=2不成立,所以未對@賦值,也不會將其賦值為NULL.
寫下上述兩個問題,希望看到的朋友留意.