關(guān)于使用ASP隨機(jī)查詢數(shù)據(jù)庫中的數(shù)據(jù),有兩種兩見的數(shù)據(jù)庫,即Sql Server和 Access。 SQL server數(shù)據(jù)庫有個NewID函數(shù),可以很方便的用SQL語句得到數(shù)據(jù)表中的隨機(jī)數(shù)據(jù)。即可以使用以下SQL語句來實(shí)現(xiàn): sql="Select top 10 * from TableName order by NewId()" Access數(shù)據(jù)庫同樣提供一個Rnd函數(shù),可以通過以下SQL語句來實(shí)現(xiàn)隨機(jī): sql="select top 10 * from TableName order by Rnd(id)" Rnd(id) 其中的id只是為了提供一個種子,可以利用其他任何數(shù)值來完成。在這里Id為主鍵的值,因?yàn)橥ǔ6裕麈I一般為自動編號字段,即數(shù)值型。 可通過使用后發(fā)現(xiàn),程序在第一次執(zhí)行時是可以實(shí)現(xiàn)隨機(jī)取得記錄,但反復(fù)刷新后發(fā)現(xiàn),每次返回的數(shù)據(jù)都相同。分析后發(fā)現(xiàn),由于Access數(shù)據(jù)庫記錄集緩存的原因,從代碼里得到Access數(shù)據(jù)庫隨機(jī)記錄是得不到,需要用隨機(jī)SQL語句的辦法來消除緩存。 有人說在程序中加上Randomize初始化隨機(jī)種子,這只說對了一半,在程序中簡單的加上Randomize,是沒作用的,道理很簡單,Randomize不可能影響SQL語句中的Rnd,這個Rnd只不過是個字符串,SQL語句是通過數(shù)據(jù)庫引擎去執(zhí)行的,正因?yàn)槿绱耍瑹o法初始化種子,致使每次應(yīng)用產(chǎn)生的隨機(jī)序列是一樣的。 由此可見,解決問題的關(guān)鍵就是如何初始化隨機(jī)種子。Rnd函數(shù)語法是Rnd(number),它有一個特性,就是如果使用了負(fù)參數(shù)的 number,那么就會產(chǎn)生一個固定的隨機(jī)序列。利用這個特性,我們的問題就迎刃而解了,這就是每次調(diào)用Rnd函數(shù)時,使用一個負(fù)的不同的number,從而達(dá)到產(chǎn)生不同隨機(jī)序列的目的。經(jīng)過測試,問題解決。使用如下代碼即可使用正確的隨機(jī)。 Randomize sql="select top 10 * from TableName order by Rnd("&Rnd()&"-id)"