Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL带RAND的多次插入-如何更改RAND值_Sql_Sql Server_Sql Insert - Fatal编程技术网

SQL带RAND的多次插入-如何更改RAND值

SQL带RAND的多次插入-如何更改RAND值,sql,sql-server,sql-insert,Sql,Sql Server,Sql Insert,我有一个语句,它根据一个随机值和另一个值将值插入到表中 INSERT INTO TRAINER_SYNC (Steps, TrainerId, SyncDate) SELECT AverageSteps * (RAND()*(1.15-0.85)+0.85), Id, GETDATE() FROM TRAINER 这很好,但每当两个“培训师”具有相同的“平均步骤”时,插入表中的数字总是相同的 例如,如果所有培训师的平均步数均为10000,则以下是TRAINER\u SYNC表中的结果 Id

我有一个语句,它根据一个随机值和另一个值将值插入到表中

INSERT INTO TRAINER_SYNC (Steps, TrainerId, SyncDate)
SELECT AverageSteps * (RAND()*(1.15-0.85)+0.85), Id, GETDATE()
FROM TRAINER
这很好,但每当两个“培训师”具有相同的“平均步骤”时,插入表中的数字总是相同的

例如,如果所有培训师的平均步数均为
10000
,则以下是
TRAINER\u SYNC
表中的结果

Id  TrainerId   SyncDate                    Steps
10  1           2018-10-20 18:42:16.407     9482
11  2           2018-10-20 18:42:16.407     9482
12  3           2018-10-20 18:42:16.407     9482
13  4           2018-10-20 18:42:16.407     9482
14  5           2018-10-20 18:42:16.407     9482
15  6           2018-10-20 18:42:16.407     9482
16  7           2018-10-20 18:42:16.407     9482
17  8           2018-10-20 18:42:16.407     9482
18  9           2018-10-20 18:42:16.407     9482
有没有办法使insert语句中的
RAND()
更精确。。。“随机”?我不确定它叫什么,但是重置初始种子,这样插入的每次迭代都会给我一个不同的随机值?

您可以使用

(一)
RAND(校验和(NEWID())

(二)

rand()。这可能会令人困惑,因为:

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()
。您可以使用以下方法创建表:

SyncDate datetime default getdate()

因此,默认值是插入时间。

,至少对于MS SQL而言是这样Server@mint什么是数据库管理系统?@a_horse_和_no_名字听起来很愚蠢,我从来都不知道我用过什么数据库产品。。。我一直只使用SQL Server Management Studio,但我猜我使用的是
SQL Server
SyncDate datetime default getdate()