There are occasions when a random sample of a query's rows are needed. A simple but non-functioning solution is to include the system random number generator function within the query. Unfortunately, a single random number is generated for the query when what is desired is a random number for each row.
Another solution that is only available with SQL Server 2000 is to use a User Defined Function (UDF) to wrap the system random number generator. Since UDFs are invoked on a row-by-row basis, this approach theoretically could work. Unfortunately (again), Microsoft has restricted the usage of nondeterministic system functions that change the global state of the database. This includes the usage of the random number generator.
But there is a workaround for non-deterministic functions, which is to first create a view, then create a UDF that selects from the view and finally, reference the UDF in the query. Here's an example:
use master go create view dbo.RandomNumbers (RandomNumber) as select rand( ) as RandomNumber GO CREATE FUNCTION dbo.RandomNumberGet ( ) RETURNS real AS BEGIN declare @r real set @r = (select RandomNumber from RandomNumbers) return @r END go use Northwind go select RandomNumber , OrderID , CustomerID , EmployeeID FROM (select CAST(master.dbo.RandomNumberGet() * 100 as integer) as RandomNumber , OrderID , CustomerID , EmployeeID from Orders ) As RandomOrders Order by RandomNumber
This was first published in February 2005