为它们生成行的随机数

时间:2013-04-02 21:50:51

标签: sql tsql

我正在尝试为那些还没有密码的行设置一个介于1234和9999之间的4位数密码。

我的第一次尝试使用以下代码。

begin tran

DECLARE @Lower   int
DECLARE @Upper   int
SET @Lower = 1234 -- Lowest password value
SET @Upper = 9999 -- Highest password value

update DestinationComparisons
set Password = ROUND(((@Upper - @Lower - 1) * RAND() + @Lower), 0)
where Password = '' or Password is null

commit tran
go

但是,这似乎为我更新的每一行提供了相同的4位数字。显然,我想为每一行添加不同的密码。

有人能帮我看看我错过了吗?

2 个答案:

答案 0 :(得分:2)

这是一种可能性:

with toupdate as (
      select dc.*,
             (ROW_NUMBER() over (order by newid()) / cast(COUNT(*) over () as float)) as randnum
      from DestinationComparisons dc
     )
update toupdate
    set Password = ROUND(((@Upper - @Lower - 1) * randum + @Lower), 0)
    where Password = '' or Password is null

它使用newid()生成随机行号,然后将其除以teh count以获得0到1之间的值。然后可以将其用于密码计算。

答案 1 :(得分:2)

begin tran
update DestinationComparisons
set Password = cast(left(cast(ABS(checksum(newid())) as varchar),4) as int)
where Password = '' or Password is null
commit tran