Try this: select Rand1.n as RandomIntegerBetweenAB , Rand2.n as RandomIntegerBetweenXY , DateAdd(Day, Rand3.n, GetDate()) as RandomDateBetweenAB , Rand4.n as RandomInteger from api.RandomIntBetween(0, 100) as Rand1 cross apply api.RandomIntBetween(-50, 25) as Rand2 cross apply api.RandomIntBetween(-365, 365) as Rand3 cross apply api.RandomIntBetween(default, default) as Rand4; We use this view to generate a random integer (only because SQL Server won't simply let us use `Crypt_Gen_Random()` in a UDF): create view api.vw_RandomInt with schemabinding as ( select Cast(Crypt_Gen_Random(4) as int) as n ); Using this view as a base we can get whatever random integer and then do some maths to rescale it: create function api.RandomIntBetween ( @x int = -2147483648 , @y int = 2147483647 ) returns table with schemabinding as return ( select Cast(Round(c.f, 0, 0) as int) as n from (values( case when @x < @y then @x else @y end , case when @y > @x then @y else @x end )) a ([Min], [Max]) cross join api.vw_RandomInt as b cross apply api.NormalizeBetween( b.n , -2147483648 , 2147483647 , a.[Min] - 0.5 , a.[Max] + 0.5 ) as c ); Where the definition of NormalizeBetween is: create function api.NormalizeBetween ( @f float = 1. , @x float = 0. , @y float = 1. , @a float = 0. , @b float = 1. ) returns table with schemabinding as return ( select ((@f - @x) * (@b - @a)) / NullIf(@y - @x, 0) + @a as f );