我們團隊最近為旅行包組織完成了一個項目,因為這個項目,我們受到了很多客戶熱情洋溢的感謝信和E-mail。我們將這些贊揚保存在一個稱之為Kudos的榮譽表中。
在網站設計階段,我們決定利用Kudos表在網站上顯示客戶的反饋信息。而顯示的時候只需要10條記錄,但是我們不希望只能顯示那固定的幾條反饋信息,因為它有些惱人并且需要維護。所以我們選擇隨機方法挑出10條記錄。將在下面給你講解在SQL Server中如何產生隨機集。
因為你沒有這個名叫Kudos的表,那我們就選用SQL Server有的Northwind表作為示例。很明顯T-SQL函數不能滿足這個要求:
useNorthwind
select rand(), productid, productname from Products
這個方法的問題在于Rand()函數在給定命令里所有行都返回相同的值,見Listing A。
你可能不需要得到這樣的結果,則可以給rand()函數提供一個種子值。在下面的代碼中,我們在Rand()函數中給定每一行的productid作為種子值。
select top 10
rand(productid) as row, productid, productname
from Products
order by row
返回的結果見Listing B.
不論這個命令運行多少次,雖然隨機指派的行返回唯一的值,但是我們的得到的productids數字是10進制的。這個方法還沒有起作用。
但是,這里提供了另外一個更有用的函數:NewID(),它返回一個GUID(全局唯一標志符)。我們看看Rand()函數被NewID()函數代替后的結果怎么樣:
select top 10
newid() as row, productid, productname
from Products
order by row
運行的結果與Listing C中的結果很相似。
你的結果有點不同,因為NewID()在每一次調用的時候都產生一個GUID,因此,如果將上面的命令運行2到3次,得到的結果是不同的。
這個方法是調用NewID()的值作為一列,然后通過NewID()排列這些值。此方法很簡單,并且可以應用到不同的場合。例如:你可能需要創建一些有某種特性的產品的列表或隨機挑選10個客戶或者100個隨機挑選出來的訂單的詳細資料等。
SQL Server不是設計用于產生隨機集的,但是其設計是基于數學而非商學的。幸虧有NewID()函數,我們才能夠毫不費力地產生隨機數據集。