top
Loading...
在SQLServer中使用NewID()產生隨機集

我們團隊最近為旅行包組織完成了一個項目,因為這個項目,我們受到了很多客戶熱情洋溢的感謝信和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()函數,我們才能夠毫不費力地產生隨機數據集。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗