select top n *
from tableA
order by newid()
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;
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
{
DataIndex.Add(sdr[0]); //存入ArrayList
}
//從ArrayList中隨機讀取數據項
Random rand = new Random();
int num = Convert.ToInt32(DataIndex[rand.Next(DataIndex.Length)]);
//讀取記錄的Sql字符串
string SqlStr = "select * from tableA where PK = " + num;
ArrayList DataIndex = new ArrayList();
while (sdr.Read()) //sdr爲存放所有主鍵值的SqlDataReader
{
DataIndex.Add(sdr[0]); //存入ArrayList
}
//從ArrayList中隨機讀取數據項
Random rand = new Random();
int num = Convert.ToInt32(DataIndex[rand.Next(DataIndex.Length)]);
//讀取記錄的Sql字符串
string SqlStr = "select * from tableA where PK = " + num;