Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Chriss Miller on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Random Query

Status
Not open for further replies.

KeyserSoze1877

Programmer
Joined
Sep 6, 2001
Messages
95
Location
US
I have a table of 70+ records of picture information. A gallery website I have I only want to display 15 pictures at once.
How do I select all 70+ records and randomly choose 15 out of the entire recordset? So each time the page is viewed, the gallery changes?

 
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 = &quot;N&quot;
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(&quot;DECLARE CUR_MEU CURSOR SCROLL FOR SELECT TOP &quot; + @VALOR + &quot; &quot; + @CAMPO+ &quot; FROM &quot; +@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(&quot;DECLARE CUR_MEU CURSOR SCROLL FOR SELECT TOP &quot; + @VALOR + &quot; &quot; + @CAMPO+ &quot; FROM &quot; +@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 = &quot;N&quot;
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: &quot;S&quot;-> THE PROCEDURE CAN RETORN SAME RANDOM RECORDS
&quot;N&quot;-> 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,&quot;PRODUCTS&quot; , &quot;PRODUCTNAME&quot;, &quot;S&quot;

EXEC PROC_RANDOM 10,&quot;SUPPLIERS&quot; , &quot;COMPANYNAME&quot; , &quot;N&quot;

EXEC PROC_RANDOM 10,&quot;SUPPLIERS&quot; , &quot;COMPANYNAME&quot; , &quot;S&quot;

EXEC PROC_RANDOM 10,&quot;SUPPLIERS&quot; , &quot;CompanyName+contactName&quot; , &quot;S&quot;

EXEC PROC_RANDOM 10,&quot;SUPPLIERS&quot; , &quot;CompanyName+contactName&quot;

 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top