为每行和每列生成随机数

H. *_*lyn 4 sql-server random

我将在我的数据库中编辑一些假数据。但是如果我为每一行和每一列生成随机数,它就没有我想要的那么随机。结果可以在下图中看到。

没有随机数

这是我使用的代码:

WITH x AS 
(
    SELECT mintwee, mineen, nul, pluseen, plustwee 
    FROM Topic
)
SELECT mintwee = CAST(RAND()*100 AS INT),
       mineen = CAST(RAND()*100 AS INT), 
       nul = CAST(RAND()*100 AS INT),
       pluseen = CAST(RAND()*100 AS INT),
       plustwee = CAST(RAND()*100 AS INT)
FROM x
Run Code Online (Sandbox Code Playgroud)

和这个:

WITH x AS 
(
    SELECT 
        mintwee = CAST(RAND()*100 AS INT), 
        mineen = CAST(RAND()*100 AS INT),
        nul = CAST(RAND()*100 AS INT), 
        pluseen = CAST(RAND()*100 AS INT), 
        plustwee = CAST(RAND()*100 AS INT)
    FROM Topic
)
SELECT mintwee, mineen, nul, pluseen, plustwee
FROM x ;
Run Code Online (Sandbox Code Playgroud)

但两者都有相同的结果。我知道,我必须使用一个UPDATE语句,但这仅用于结果良好的尝试。之后,我将使用该UPDATE语句。

我使用带有快速 2014 版本的 SQL 服务器。

Dan*_*man 6

由于表行和 RAND 函数之间没有相关性,因此该表达式在查询中只计算一次。

生成随机值的一种方法是使用 NEWID() 函数。下面的示例生成 0-99 范围之间的随机整数值。可以针对不同范围调整模值,您可以使用此基本技术为日期、字符等生成随机值。

WITH x AS 
(
  SELECT mintwee, mineen, nul, pluseen, plustwee 
  FROM Topic
)
SELECT mintwee = CAST(SUBSTRING(CAST(NEWID() AS binary(16)),1, 3) AS int) % 100,
       mineen = CAST(SUBSTRING(CAST(NEWID() AS binary(16)),1, 3) AS int) % 100,
       nul = CAST(SUBSTRING(CAST(NEWID() AS binary(16)),1, 3) AS int) % 100,
       pluseen = CAST(SUBSTRING(CAST(NEWID() AS binary(16)),1, 3) AS int) % 100,
       plustwee= CAST(SUBSTRING(CAST(NEWID() AS binary(16)),1, 3) AS int) % 100
FROM x;
Run Code Online (Sandbox Code Playgroud)

编辑:

根据 Aaron 的评论,如果您只需要 32 位整数,则可以简化表达式。附加示例:

--postive int
SELECT ABS(CHECKSUM(NEWID()));
--postive and negative int
SELECT CHECKSUM(NEWID());
--postive bigint
SELECT CAST(SUBSTRING(CAST(NEWID() AS binary(16)),1, 7) AS bigint);
--negative and postive bigint
SELECT CAST(SUBSTRING(CAST(NEWID() AS binary(16)),1, 8) AS bigint);
--dates between now and 1 year ago
SELECT DATEADD(day, -ABS(CHECKSUM(NEWID())) % 365, GETDATE());
--random uppercase character
SELECT CAST(CAST(65 + ABS(CHECKSUM(NEWID()) % 26) AS binary(1)) AS char(1));
Run Code Online (Sandbox Code Playgroud)