2016-06-09 55 views
0

我想更新一个生成随机“pin”数字的表。这是我想要的,但最后所有的行都获得相同的数字。我曾尝试在一段时间内完成它,但它仍然是一样的。带有随机值的SQL Server更新

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 

感谢您的帮助

回答

1

可以使用CRYPT_GEN_RANDOM()代替RAND()避开RAND()被评估一次:

UPDATE totals 
SET pin = (@Lower + ABS(CRYPT_GEN_RANDOM(8) % (@[email protected]+1))) 
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()))。但是,对于只能运行一次的表达式和子查询,您仍然需要小心。我认为上述表述应该起作用。