【问题标题】:Generating Random Numbers for Rows without Them [duplicate]为没有它们的行生成随机数[重复]
【发布时间】:2013-03-24 09:28:56
【问题描述】:

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

谁能帮我看看我错过了什么?

【问题讨论】:

  • rand() 每个查询仅评估一次,例如select rand(), somefield from sometable 将始终为每一行返回相同的 rand 值。您必须执行类似select rand(id + time()) 之类的操作,以强制为每一行添加一个新种子。
  • 有没有办法做我想做的事?
  • 如果你能接受字母和数字,我有一个建议。

标签: sql tsql


【解决方案1】:
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

【讨论】:

  • 非常有趣。还在检查。
  • 其实第二版可以生成3位密码。
  • 上下边界在哪里?
【解决方案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 之间的值。然后可以将其用于密码计算。

【讨论】:

  • 出现语法错误。还在寻找...
  • @usr:你对“Still looking...”的哪一部分感到困惑?
  • 这段代码给我错误“关键字'as'附近的语法不正确”,我不确定我明白为什么。
  • @JonathanWood。 . .您使用的是什么版本的 SQL Server?这将适用于 2005 及更高版本(并且应该适用于大多数 Sybase 版本)。
  • @GordonLinoff:我使用的是 2008 R2。可能是我。抱歉,我对 WITH 语法不太熟悉。我在 begin tran 行之后粘贴了您的代码。
猜你喜欢
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2020-07-16
相关资源
最近更新 更多