Reputation: 5379
I think i have cracked a way of generating the random numbers. But whats the best way in SQL server to loop this efficiently? I have the following SQL:
DECLARE @Random1 INT;
DECLARE @Random2 INT;
DECLARE @Random3 INT;
DECLARE @Random4 INT;
DECLARE @Random5 INT;
DECLARE @Random6 INT;
DECLARE @Upper INT;
DECLARE @Lower INT;
---- This will create a random number between 1 and 49
SET @Lower = 1 ---- The lowest random number
SET @Upper = 49 ---- The highest random number
SELECT @Random1 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random2 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random3 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random4 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random5 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random6 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
--SELECT @Random;
INSERT INTO [lotto].[dbo].[CustomerSelections]
([draw_date]
,[val1]
,[val2]
,[val3]
,[val4]
,[val5]
,[val6])
VALUES
(
'2013-07-05'
,@Random1
,@Random2
,@Random3
,@Random4
,@Random5
,@Random6
)
What is the best way to get SQL Server to run this SQL 100,000 times?
Upvotes: 2
Views: 445
Reputation: 34784
This took 4 seconds:
SET NOCOUNT ON
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=100000)
BEGIN
--Do Stuff
DECLARE @Random1 INT, @Random2 INT, @Random3 INT, @Random4 INT, @Random5 INT, @Random6 INT, @Upper INT, @Lower INT
---- This will create a random number between 1 and 49
SET @Lower = 1 ---- The lowest random number
SET @Upper = 49 ---- The highest random number
SELECT @Random1 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random2 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random3 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random4 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random5 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random6 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
--SELECT @Random;
INSERT INTO #test ([draw_date],[val1],[val2],[val3],[val4],[val5],[val6])
VALUES ('2013-07-05',@Random1,@Random2,@Random3,@Random4,@Random5,@Random6)
SET @intFlag = @intFlag + 1
END
GO
Update: This runs quickly because it is into a temp table, looping directly into actual table would be a much slower process, so you'd then want to INSERT the set into your final table from your temp table:
INSERT INTO Table
SELECT *
FROM #test
For reference, a simple WHILE loop shell:
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=5000)
BEGIN
--Do Stuff
--Iterate
SET @intFlag = @intFlag + 1
END
GO
Upvotes: 2
Reputation: 453910
Doing it all in one statement with no loops will be the most efficient way.
INSERT INTO [lotto].[dbo].[CustomerSelections]
([draw_date]
,[val1]
,[val2]
,[val3]
,[val4]
,[val5]
,[val6])
SELECT TOP (100000 )
'2013-07-05',
1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
1 + ABS(CRYPT_GEN_RANDOM(8) % 49)
FROM master..spt_values v1,
master..spt_values v2
Upvotes: 12