sqlserver隨機取記錄

2022-02-10 23:20:05 字數 1338 閱讀 3175

sqlserver隨機取記錄

2023年03月09日 星期一 下午 06:03

sqlserver本身並沒有提供隨機讀取記錄的功能,但我們可以通過一些方法來實現這個目的。本文介紹了其中幾種方法並比較了各自的優劣。

方法一:

直接通過sql語句實現,如:

select top n * from tablea order by newid()
這是最簡單的方法,通過呼叫sqlserver的newid()函式(產生guid—全域性唯一標誌符)來產生隨機記錄。

採用這種方法時,需要將表中所有記錄與newid()生成的值進行比較從而進行排序。因此,如果表中的記錄較多,操作會非常緩慢。

方法二:

假設表中有乙個自增長主鍵,增量為1。這時我們可以這樣處理,取出主鍵的邊界值(最大值和最小值),然後通過乙個演算法得到介於(包括)兩個邊界之間的隨機值,最後按照這個值取出對應記錄。下面是c#的例子:

//生成隨機數

random rand = new random();

int num = rand.next(minval,maxval + 1); //minval為主鍵的最小值,maxval為主鍵的最大值

//讀取記錄的sql字串

string sqlstr = "select * from tablea where pk = " + num;

這種方法較前一種方法的操作速度有了較大提高(特別是在大資料量的情況下)。但只有當主鍵值是連續的,中間沒有斷開的情況,並且增量為1時才能用這種方法。那麼,如何才能解決這個問題呢?請繼續往下看。

方法三:

對方法二進行了改進。主要思路是,將表中所有的主鍵值讀進乙個陣列,從陣列中隨機讀出乙個值,按照這個值取出對應記錄。下面是c#的例子:

//將主鍵值讀進arraylist

arraylist dataindex = new arraylist();

while (sdr.read()) //sdr為存放所有主鍵值的sqldatareader

//從arraylist中隨機讀取資料項

random rand = new random();

int num = convert.toint32(dataindex[rand.next(dataindex.length)]);

//讀取記錄的sql字串

string sqlstr = "select * from tablea where pk = " + num;

這樣不管主鍵是否為自增長字段,也不管數值是否連續,都能夠應付自如了。經過筆者的測試,在資料量為50萬的情況下**執行速度幾乎沒有受到什麼影響,可見arraylist的操作效能是可以信賴的。

SQL Server 隨機取n條記錄

客戶要搞個 程式。生個隨機數往記錄上對感覺太麻煩,想讓記錄隨機排序。select from table order by rand rand需要個種子,幫助例項 select rand datepart mm,getdate 100000 datepart ss,getdate 1000 datep...

access excel取隨機n條記錄

乙個簡單的問題被我搞複雜了,都不行,我一直在想著怎麼用 access 的語法來實現,也就是在 access 上面做文章,回來的時候,靈機一動,既然是 sql就應該可以用 sql的語法來實現,何況我對 access 不很熟原來的語句 select top 100 from openrowset mic...

sql server 取幾個到幾條記錄

1 取前十條記錄 select top 10 id from dbo.sysobjects 2 取11條記錄到30條記錄 select top 20 from dbo.sysobjects where id not in select top 10 id from dbo.sysobjects 效能...