1. 程式人生 > >小心 SQL語句SELECT TOP 的用法

小心 SQL語句SELECT TOP 的用法

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>        前段時間,我編寫了一套ASP+MSSQL的房產程式;今天有一位使用者找到我說,她無法釋出資訊了,系統提示:重複資訊,拒絕釋出。我的反應就是很正常,因為這是我故意設定的,就是為了防止重複資訊;但使用者說她沒看到重複資訊,怎麼系統也拒絕釋出呢。而我也只是採用了簡單的select top n的查詢進行判斷而已,並且這個n設定僅僅為30啊。     近些時間來,我也發現一些細節問題。有不少使用者有意無意地在標題里加上一些無意義的阿拉伯數字,我明白:這些使用者也同樣的遇到了重複資訊拒絕釋出的困擾了,這樣做也是為了規避這樣的限制。結合今天的這位向我反應問題的使用者,我意識到:可能是我的程式判斷有誤了。     馬上本地localhost測試,果然,我釋出了一條3個月前的標題相同的資訊,系統也提示重複資訊,拒絕釋出;而這個3個月前的id數字距現在有2萬多了的差距了,遠遠超出了我的select top 30的查詢了。     開啟程式碼,資料庫為mssql 2000:
dim rs,sql

Set rs = Server.CreateObject ("ADODB.Recordset")

sql="select top 30 * from data where title='"&title1&"' order by id desc"

rs.Open sql,conn,1,3

if rs.eof then

'入庫操作

else

'重複,拒絕釋出

end if
    上面的這段程式碼是有錯誤的。它和我的原意相反。sql語句裡同時存在where和top語句的時候,程式執行的是全表掃描,首先是查詢符合where條件的記錄,而這裡的top限制形同虛設。如果全表有上百萬的資料,那麼就這麼一個簡單的判斷,就有可能拖垮資料庫。     我們可以採用變通的方法,就是去掉sql查詢裡的where條件,放入到迴圈體內做判斷;比如採用
piaoyi
以下這樣的程式碼:
dim rs,sql,cf

cf=0 '初始化重複標識為0

Set rs = Server.CreateObject ("ADODB.Recordset")

sql="select top 30 * from data order by id desc"

rs.Open sql,conn,1,3

do while not rs.eof

if rs("title")=title1 and datediff("h",rs("time"),now())<24 then

'標題相同,且在24小時內發帖

cf=1 ''重複標識為1

end if

rs.movenext

loop 



if cf=0 then

'入庫操作

elseif cf=1 then

'拒絕釋出重複資訊

end if
    如果你希望使用selcet top語句,就不要附帶where條件,這一點要記住,不然執行的是全表掃描。     另外,也有人問道,如何選出第N條到第2N條記錄呢。這樣的sql語句就可以了: “select top n * from TABLE_NAME where id not in (select top n id from TABLE_NAME order by id desc) order by id desc”。     一個小的細節問題,如果不注意的話,有可能拖累整個程式的穩定性、健壯性;當資料量不大的時候,這種影響可能感覺不出來,而當資料量達到一定的程度的時候,比如有100人同時進行插入資料的操作時,系統很有可能假死,iis崩潰掉。而這,不是我希望看到的。 作者:Flymorn 來源:
飄易部落格
版權所有。轉載時必須以連結形式註明作者和原始出處及本宣告。 <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>