Technical Article

Random Data Generator

,

Sometimes, I find that I have need to generate a data set of random integers or characters. I created the following query to generate a data set containing a random set of data for various data types (integer, float, decimal, varchar, bit and datetime). For integers you can input a minimum and maximum value to be generated.

The query is well commented and is easy enough to alter for your specific needs.

I use a Numbers (i.e Tally) table to generate the appropriate number of rows needed. If you don't have a Numbers table simply change the FROM clause to:

FROM sys.columns A CROSS JOIN sys.columns B CROSS JOIN sys.columns C

I hope some of you find this helpful.

Peter Wehner

DECLARE @min INT, @max INT, @rowCnt INT

SET @min = 1;
SET @max = 1000;
SET @rowCnt = 1000;

SELECT TOP (@rowCnt)

--ints
RandInt= ABS(CHECKSUM(NEWID())),-- Random integer
RandIntMinMaxInc= (ABS(CHECKSUM(NEWID())) % (@max - @min + 1)) + @min,-- @min & @max inclusive
RandIntMinIncMaxExc= (ABS(CHECKSUM(NEWID())) % (@max - @min)) + @min,-- @min inclusive & @max exclusive
RandIntMinExcMaxInc= (ABS(CHECKSUM(NEWID())) % (@max - @min)) + @min + 1,-- @min exclusive & @max inclusive
RandIntMinMaxExc= (ABS(CHECKSUM(NEWID())) % (@max - @min - 1)) + @min + 1,-- @min exclusive & @max exclusive

--decimals/floats
RandFloatMinMaxExc= RAND(CHECKSUM(NEWID())) * (@max - @min ) + @min,-- min & max exlusive
RandDecMinMaxExc= CONVERT(DECIMAL(11,2), RAND(CHECKSUM(NEWID())) * (@max - @min ) + @min),-- min & max exlusive (set presicion & scale appropriately)

-- DateTime (3,012,153 is max # of days for datetime, 3,652,058 max days for datetime2)
RandDate= DATEADD(DAY, ABS(CHECKSUM(NEWID())) % (3012153 + 1), CONVERT(DATETIME, '17530101')), -- Datetime (min = 1753-01-01, max = 9999-12-31)
RandDate2= DATEADD(DAY, ABS(CHECKSUM(NEWID())) % (3652058 + 1), CONVERT(DATETIME2, '00010101')), -- Datetime2 (min = 0001-01-01, max = 9999-12-31)

-- Bit
RandBit= CONVERT(BIT, ROUND(RAND(CHECKSUM(NEWID())), 0)),

-- varchar
RandLetter= SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 1 + ABS(CHECKSUM(NEWID())) % 26, 1),

-- replicate a random letter a random number of times between @min and @max
RandString= CONVERT(VARCHAR(MAX), REPLICATE(SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 1 + ABS(CHECKSUM(NEWID())) % 26, 1),(ABS(CHECKSUM(NEWID())) % (@max - @min + 1)) + @min))

FROM dbo.Numbers
--FROM sys.columns A CROSS JOIN sys.columns B CROSS JOIN sys.columns C

Rate

3.75 (4)

You rated this post out of 5. Change rating

Share

Share

Rate

3.75 (4)

You rated this post out of 5. Change rating