sql server - Generate list of new unique random numbers in T-SQL -
i need stored procedure generate @n records, each unique random 8 digit number. number must not incremental , must not exist in table.
create table codes ( id uniqueidentifier primary key, code int, constraint uq_code unique(code) ); i can generate random numbers:
declare @min int = 0, @max int = 99999999, @n int = 100; select top (@n) floor(cast(crypt_gen_random(4) bigint) / 4294967296 * ((@max - @min) + 1)) + @min sys.all_objects s1 cross join sys.all_objects s2; but i'm struggling figure out how atomically generate , insert @n numbers [codes] table whilst making provision avoid collisions. can done without loop?
update
"must not incremental" meant each call sp, don't want return "1, 2, 3, 4" or other common pattern. need able consume values incremental values exist generated @ different points in time rather sequentially.
you can use cte calculated codes, distinct , check if code exists in table:
;with cte_stream ( select floor(cast(crypt_gen_random(4) bigint) / 4294967296 * ((@max - @min) + 1)) + @min code sys.all_objects s1 cross join sys.all_objects s2; ) insert [codes] select distinct top (@n) s.code cte_stream s not exists (select * [codes] c c.code = s.code) so distinct helps avoid collision between new codes , exists avoid collisions existing codes in [codes] table, , order newid() helps random values new codes
Comments
Post a Comment