Try this one:
-- DROP THE PROCEDURE
DROP PROCEDURE PROC_RANDOM
CREATE PROCEDURE PROC_RANDOM @VEZES INT , @TABELA CHAR(50) , @CAMPO CHAR(50) , @REPETIR CHAR(1) = "S"
AS
-- DECLARATION OF VARIABLES
DECLARE @CONTADOR INT , @VAL INT , @AUX CHAR(10)
DECLARE @TOTAL INT , @VALOR INT
DECLARE @NAME CHAR(50)
-- NO MESSAGES
SET NOCOUNT ON
-- CHECK FOR THE TABLE CALLED 'RETORNO'
IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N'[DBO].[RETORNO]') AND OBJECTPROPERTY(ID, N'ISUSERTABLE') = 1)
DROP TABLE [DBO].[RETORNO]
-- CREATES THE TABLE
CREATE TABLE RETORNO
(
CAMPO CHAR(50)
)
-- IF THE USER DON'T WANT SAME RESULTS , CREATE A TEMPORARY TABLE
IF @REPETIR = "N"
BEGIN
CREATE TABLE #ALE
(
COD INT
)
END
-- GET THE TOTAL NUMBER OF RECORDS , USING THE SYSINDEXES TABLE
SELECT @TOTAL = ROWS FROM SYSINDEXES
WHERE ID = object_ID(@TABELA)
AND INDID < 2
-- IF THERE IS A TABLE....
IF @TOTAL IS NOT NULL
BEGIN
-- CLEAN THE COUNTER
SELECT @CONTADOR = 0
-- DO A LOOP SEVERAL TIMES TO GET THE NUMBER , AND RECORDS , OF RANDOM RECORDS THAT THE USER WANT
WHILE @CONTADOR <> @VEZES
BEGIN
-- INCREASE THE COUNTER
SELECT @CONTADOR = @CONTADOR + 1
-- GET A RANDOM NUMBER USING THE DATE....
SELECT @VAL = REVERSE((DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()))
SELECT @AUX = CONVERT(CHAR,@VAL * ( @CONTADOR ) )
SELECT @AUX = REVERSE(SUBSTRING(@AUX,3,5))
SELECT @VALOR = (CONVERT(INT,@AUX)%@TOTAL)+1
-- IF THE USER DON'T WANT TO REPEAT DATA...
IF @REPETIR = "N"
BEGIN
-- CHECK FOR THE USE OF THIS NUMBER
IF NOT EXISTS(SELECT COD FROM #ALE WHERE COD = @VALOR)
BEGIN
-- CREATE A DYNAMIC CURSOR WITH SOME RECORDS. THE LAST WILL BE THAT RANDOM
EXECUTE("DECLARE CUR_MEU CURSOR SCROLL FOR SELECT TOP " + @VALOR + " " + @CAMPO+ " FROM " +@TABELA )
OPEN CUR_MEU
-- GO TO THE LAST RECORD
FETCH LAST FROM CUR_MEU INTO @NAME
-- INSERT THE DATA IN THE RETURN TABLE
INSERT INTO RETORNO VALUES(@NAME)
CLOSE CUR_MEU
DEALLOCATE CUR_MEU
-- STORE THE RANDOM NUMBER IN A TABLE TO AVOID THE USE OF THIS NUMBER AGAIN
INSERT INTO #ALE VALUES(@VALOR)
END
ELSE
BEGIN
-- IF THIS NUMBER WAS USED THEN DECREASE THE COUNTER AND TRY AGAIN...
SELECT @CONTADOR = @CONTADOR - 1
END
END
ELSE
BEGIN
-- CREATE A DYNAMIC CURSOR WITH SOME RECORDS. THE LAST WILL BE THAT RANDOM
EXECUTE("DECLARE CUR_MEU CURSOR SCROLL FOR SELECT TOP " + @VALOR + " " + @CAMPO+ " FROM " +@TABELA )
OPEN CUR_MEU
-- GO TO THE LAST RECORD
FETCH LAST FROM CUR_MEU INTO @NAME
-- INSERT THE DATA IN THE RETURN TABLE
INSERT INTO RETORNO VALUES(@NAME)
CLOSE CUR_MEU
DEALLOCATE CUR_MEU
END
END
SET NOCOUNT OFF
END
-- IF THE TABLE WAS CREATED , WE MUST DROP IT
IF @REPETIR = "N"
BEGIN
DROP TABLE #ALE
END
-- RETURN TO THE USER ALL RANDOM RECORDS
SELECT CAMPO FROM RETORNO
-- DROP THE TABLE WITH THE RANDOM RECORDS
DROP TABLE RETORNO
GO
/* END OF THE STORED PROCEDURE */
/* ----------------------------------
USE OF THE STORED PROCEDURE:
1º ARGUMENT: HOW MANY RANDOM RECORDS THE STORED PROCEDURE SHOULD RETURN
2º ARGUMENT: NAME OF THE TABLE WICH THE RANDOM RECORDS SHOULD RETURN
3º ARGUMENT: FIELD ( COLUMN ) OF THE TABLE. MUST BE A CHAR(50) OR LEAST. THIS CAN BE CHANGED BY OTHERS DATATYPES WITH A FEW MODIFICATIONS
4º ARGUMENT: "S"-> THE PROCEDURE CAN RETORN SAME RANDOM RECORDS
"N"-> ALL RECORDS RETURNED SHOULD BE DIFFERENT
OBSERVATION: THIS FOLLOWING EXAMPLES ARE TESTED BASED ON THE TABLES OF THE NORTHWIND DATABSES
CREATED BY THE INSTALATION PROGRAMAN OF SQL SERVER 7.0 AND 2000
*/
EXEC PROC_RANDOM 10,"PRODUCTS" , "PRODUCTNAME", "S"
EXEC PROC_RANDOM 10,"SUPPLIERS" , "COMPANYNAME" , "N"
EXEC PROC_RANDOM 10,"SUPPLIERS" , "COMPANYNAME" , "S"
EXEC PROC_RANDOM 10,"SUPPLIERS" , "CompanyName+contactName" , "S"
EXEC PROC_RANDOM 10,"SUPPLIERS" , "CompanyName+contactName"