SQL Server更新具有随机值

时间:2016-06-09 21:59:46

标签: sql sql-server

我想更新一个生成随机“pin”数字的表格。这是我正在尝试但最终所有行都得到相同的数字。我已经尝试过一段时间,但它仍然是相同的。

BEGIN TRAN

DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT

---- This will create a random number between 10000 and 99999
SET @Lower = 10000 ---- The lowest random number
SET @Upper = 99999 ---- The highest random number

UPDATE Totals 
SET Pin =  ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)

--check for repeated numbers
SELECT
    Pin, COUNT(*)
FROM
    Totals
GROUP BY
    Pin
HAVING 
    COUNT(*) > 1

    --commit
    --rollback

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

每次查询都会对

rand()进行一次评估。

WITH toupdate as (
      SELECT t.*,
             ROUND(((@Upper - @Lower -1) * RAND(CHECKSUM(NEWID())) + @Lower), 0) as new_Pin
      FROM Totals
     )
UPDATE Totals 
    SET Pin = new_Pin;

解决此问题的一种方法是使用RAND(CHECKSUM(NEWID()))。但是,您仍然需要注意优化的表达式和子查询只运行一次。我认为上述表述应该有效。

答案 1 :(得分:1)

您可以使用CRYPT_GEN_RANDOM()代替RAND()来绕过RAND()评估一次:

UPDATE totals
SET pin = (@Lower + ABS(CRYPT_GEN_RANDOM(8) % (@Upper-@Lower+1)))