rand()
- это особый класс функций, который оценивается ровно один раз для каждого вызова в операторе SQL.Это может быть очень запутанным, потому что:
select rand(), rand()
возвращает два разных значения.Однако
select rand(), rand()
from (values (1), (2), (3)) v(x)
возвращает три строки - с одинаковыми двумя значениями в каждой из строк.Это «особенность» оптимизации SQL Server.Я полагаю, что getdate()
(и аналогичные функции даты / времени) являются единственными другими функциями с таким поведением.
Нормальным решением является заполнение генератора случайных чисел с помощью newid()
.Но типы возврата различны, поэтому checksum()
используется для преобразования id
в число:
INSERT INTO TRAINER_SYNC (Steps, TrainerId, SyncDate)
SELECT AverageSteps * (RAND(CHECKSUM(NEWID()))*(1.15-0.85)+0.85),
Id, GETDATE()
FROM TRAINER;
. Вы можете использовать другое начальное число, если оно доступно.Например, если на одного тренера идет только одна строка, вы можете использовать rand(id)
.Я должен отметить, что rand()
не особенно "случайен" с семенами, поэтому смежные семена часто дают похожие числа.
Возможно, вам не следует устанавливать GETDATE()
в INSERT
.Вы можете создать таблицу с помощью:
SyncDate datetime default getdate()
Таким образом, значением по умолчанию является время вставки.