SQL 彙總函式和空結果集對@@Rowcount的影響

來源:互聯網
上載者:User

今天測試一段代碼.其中有一個邏輯是,有一個表,這個表有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.

 

寫下上述兩個問題,希望看到的朋友留意.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.