我想更新一个生成随机“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
感谢您的帮助
答案 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)))