2013-04-02 32 views
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位數字。顯然,我想爲每一行輸入不同的密碼。

有人能幫我看看我失蹤了嗎?

+2

rand()僅對每個查詢(例如, 'select rand(),sometable'中的somefield將始終爲每一行返回相同的rand值。你必須做一些事情,比如'select rand(id + time())'或者其他的強制每行都有一個新的種子。 –

+0

有沒有辦法做我想做的事情? –

+0

看到鏈接的愚蠢。 –

回答

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 
+0

非常有趣。仍然檢查出來。 –

+0

其實,第二個版本可以產生3位數的密碼。 –

+0

上部和下部彈跳器在哪裏? – gotqn

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這之間的值然後可以用於密碼計算。

+0

獲取語法錯誤。仍然在尋找...... –

+1

@usr:「仍在尋找......」的哪一部分讓你感到困惑? –

+0

這段代碼給我的錯誤「關鍵字附近的語法不正確」爲'「,我不知道爲什麼。 –