0

我正在尝试为那些还没有密码的行设置一个介于 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 位数字。显然,我想为每一行设置一个不同的密码。

有人可以帮我看看我错过了什么吗?

4

2 回答 2

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()生成随机行号,然后将其除以计数以获得介于 0 和 1 之间的值。然后可以将其用于密码计算。

于 2013-04-02T21:56:51.910 回答
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
于 2013-04-02T22:03:51.200 回答