ランダムである必要がない場合は、昇順の数値に置き換えることができます。そうしないと、乱数を生成する必要があります。お気づきかもしれませんが、RAND 関数はクエリ ステートメント (select、update など) ごとに 1 つの値しか生成しません。これを回避するには、newid() 関数を使用します。この関数は、クエリによって生成された各行の GUID を生成します (SELECT newid() from MyTable
これを実行して動作を確認してください)。これを checksum() でラップして整数を生成します。SSN 範囲 (0 ~ 999,999,999) 内の値を取得するために 1,000,00,000 倍する係数。そして、それを char(9) プレフィックスとして先行ゼロで保存していると仮定します。
次のトリックは、テーブル内のすべての値に対して一意であることを確認することです。これはややこしいので、値を含む一時テーブルを設定し、値を入力してから、それらをコピーすることでそれを行います。賃借人は今…</p>
DECLARE @DummySSN as table
(
PrimaryKey int not null
,NewSSN char(9) not null
)
-- Load initial values
INSERT @DummySSN
select
UserId
,right('000000000' + cast(abs(checksum(newid()))%1000000000 as varchar(9)), 9)
from Users
-- Check for dups
select NewSSN from @DummySSN group by NewSSN having count(*) > 1
-- Loop until values are unique
IF exists (SELECT 1 from @DummySSN group by NewSSN having count(*) > 1)
UPDATE @DummySSN
set NewSSN = right('000000000' + cast(abs(checksum(newid()))%1000000000 as varchar(9)), 9)
where NewSSN in (select NewSSN from @DummySSN group by NewSSN having count(*) > 1)
-- Check for dups
select NewSSN from @DummySSN group by NewSSN having count(*) > 1
これは私が持っている小さなテーブルで機能し、大きなテーブルでも機能するはずです。これが無限ループに変わるとは思いませんが、それでも、10回の反復後にループを終了するチェックを追加したい場合があります。