El problema OP tenía mientras usaba solo rand() se debe a su evaluación una vez por consulta .
De la documentación :
El enfoque que se describe a continuación elimina la optimización y suprime este comportamiento, por lo que rand() se evalúa una vez por fila :
dateadd( second
, rand(cast(newid() as varbinary)) * 43200
, cast('08:00:00' as time) )
newid()genera un valor único de tipouniqueidentifier;- el valor se convierte con
castpara ser usado como semilla enrand([seed])función para generar unfloatpseudo-aleatorio valor de 0 a 1 y como semilla siempre es único, el valor devuelto también es único.