Record casuali con SQL Server, Access e MySQL

di Massimo Cappellesso, in Database,

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.

La strutta della tabella proverbi

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
Contenuti dell'articolo