Capita spesso di avere la necessità di selezionare un record a caso da una tabella. Ci sono diverse strade per arrivare allo stesso risultato, ma alcune sono più dirette e soprattutto offrono performance superiori.
Con questo articolo affronteremo questo argomento utilizzando i tre database più comunemente utilizzati con le ASP: SQL Server, Access e MySQL.
Come esempio utilizzeremo una tabella tblProverbi, costituita da due campi: id (chiave primaria) e Proverbio.
SQL Server
SQL Server ci mette a disposizione la funzione Rand(), funzione che ritorna un numero a virgola mobile compreso tra 0 e 1.
Possiamo quindi procedere in due modi: creare una Stored Procedure in SQL Server oppure utilizzare una classica query; i vantaggi che derivano dall'utilizzo dell'uno o dell'altro metodo sono abbastanza soggettivi: le Stored Procedures sono molto più performanti di una query, ma molto meno portabili.
Cominciamo dalla Stored Procedures.
Per prima cosa abbiamo bisogno di sapere il valore di id più alto, valore che estrarremo dalla tabella utilizzando la funzione Max() e che salveremo nella variabile @MaxValue:
SELECT @MaxValue = Max(id) FROM tblProverbi
Ora che abbiamo ottenuto il valore di id massimo, calcoliamo un valore casuale, che salveremo in @RandomNumber, utilizzando la funzione Rand():
SELECT @RandomNumber = rand() * @MaxValue
Fatto questo non ci resta che estrarre il nostro record utilizzando il numero casuale appena creato:
SELECT TOP1 * FROM tblProverbi WHERE id >= @RandomNumber ORDER BY id ASC
Da notare l'utilizzo dell'operatore >=, che ci evita spiacevoli sorprese nel caso il numero casuale generato coincida con un id inesistente.
La Stored Procedure completa si presenterà quindi così:
CREATE PROCEDURE sp_Random AS BEGIN Declare @MaxValue int, @RandomNumber float SELECT @MaxValue = Max(id) FROM tblProverbi SELECT @RandomNumber = rand() * @MaxValue SELECT TOP 1 * FROM tblProverbi WHERE id >= @RandomNumber ORDER BY id ASC END
Per applicare tale Stored Procedure ci basterà seguire questo script:
<% Set con = Server.CreateObject("ADODB.Connection") con.Open strConn ' da valorizzare set rs = con.Execute("sp_Random") If Not rs.Eof Then Response.Write rs("id") & " - " & rs("proverbio") Else Response.Write "Nessun proverbio da visualizzare" End If rs.Close : Set rs = Nothing con.Close : Set con = Nothing %>
E se invece di utilizzare un Stored Procedure volessimo utilizzare una semplice query SQL?
La logica è la stessa, basterà tradurre la Stored Procedure in una normale SELECT:
[code lang="sql"]<% Set con = Server.CreateObject("ADODB.Connection") con.Open strConn ' da valorizzare SQL = "SELECT TOP 1 * FROM tblProverbi WHERE id >= (rand() * (SELECT MAX(id) FROM tblProverbi))" set rs = con.Execute(SQL) If Not rs.Eof Then Response.Write rs("id") & " - " & rs("proverbio") Else Response.Write "Nessun proverbio da visualizzare" End If rs.Close : Set rs = Nothing con.Close : Set con = Nothing %> 2 pagine in totale: 1 2 >>