你可以使用很多種方式隨機(jī)選擇數(shù)據(jù)行;這在你想要往網(wǎng)站里加入動(dòng)態(tài)特性的時(shí)候特別有效。例如,你可以隨便選擇一個(gè)產(chǎn)品,將其作為“今天的特色產(chǎn)品”來展示,或者質(zhì)量評(píng)估人員(QA)可以生成一個(gè)隨機(jī)的調(diào)用表,以測(cè)量用戶的滿意度。

但是其中的障礙是SQL不允許隨機(jī)選擇列。好消息是,有一個(gè)簡(jiǎn)單的技巧能夠在SQL里實(shí)現(xiàn)這一功能。

該解決方案基于uniqueidentifier這個(gè)數(shù)據(jù)類型。唯一的標(biāo)識(shí)符,也叫做全局唯一標(biāo)識(shí)符(Guaranteed Unique Identifiers,GUID),看起來就像下面這樣:

4C34AA46-2A5A-4F8C-897F-02354728C7B0

SQL服務(wù)器在很多情況下都會(huì)使用GUID,最明顯的可能就是復(fù)制過程了。當(dāng)正常增長(zhǎng)的單位數(shù)據(jù)列(identity column)沒有提供足夠的關(guān)鍵字時(shí),你可以使用它們。要做到這一點(diǎn),你就要?jiǎng)?chuàng)建一個(gè)uniqueidentifier類型的數(shù)據(jù)列,而這個(gè)類型缺省的值是NewID(),就像下面一樣:

CREATE TABLE MyNewTable
(
? PK uniqueidentifier NOT NULL DEFAULT NewID(),
? AnotherColumnvarchar(50) NOT NULL,
?? . . .

這個(gè)函數(shù)就像是解決我們選擇隨機(jī)列問題的鑰匙。我們可以簡(jiǎn)單地調(diào)用NewID(),將其作為我們查詢里的一個(gè)虛擬列,就像下面這樣:

SELECT TOP 10 OrderID, NewID() as Random
FROM Orders
ORDER BY Random

最近我創(chuàng)建一個(gè)頁面,上面發(fā)表有10個(gè)隨機(jī)用戶的引言來贊美公司服務(wù),在做這個(gè)的時(shí)候我用到了這個(gè)解決方案。用戶也可以在他們每次訪問網(wǎng)站的時(shí)候看到新的引言。

這是向網(wǎng)站加入新吸引點(diǎn)的簡(jiǎn)單方法。既然你知道了如何發(fā)布隨機(jī)選擇的數(shù)據(jù)列,你看起來就像是一個(gè)SQL的明星了。


本文作者:Arthur Fuller開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序已經(jīng)有20年了。他的專業(yè)經(jīng)驗(yàn)包括Access ADPs、微軟SQL 2000、MySQL和.NET。