テストデータ作成するのに困ったので覚え書き
任意のテーブルに対してランダムな値を設定するためのT-SQL文
※主キーが数値型で設定されていることが条件(連番ならなお良し?)
値を放り込むための行はあらかじめINSERTしておくこと(中身は空でよい)
全行に対してランダムに値を設定
一行毎にINSERT,RAND()が走るためなんだかんだ言って行数が多いと時間はかかる
SetRandomValue1
DECLARE @counter int
DECLARE @lastKeyValue
SET @counter = 0
SELECT @lastKeyValue = MAX([主キー列]) FROM [テーブル名]
WHILE @counter <= @lastKeyValue
BEGIN
UPDATE [テーブル名] SET
[更新列名] = [適当なランダム値]
WHERE
[主キー列] = @counter
SET @counter = @counter + 1
END
ある程度まとまった行数に対しての同一のランダム値を設定
全行別々だと不都合という場合に。
上記からキー値を剰余でグループ化しただけ。
@seed
には固定値を入れてもよい。その場合はどれくらいの粒度でグループ化するか固定できる。
あと、INSERT,RAND()が走る回数が減るので上記より速い。
SetRandomValue2
DECLARE @counter int
DECLARE @seed int
SET @counter = 0
SET @seed = CONVERT(int, (CEILING(RAND() * [適当な数値])))
WHILE @counter < @seed
BEGIN
UPDATE [テーブル名] SET
[更新列名] = [適当なランダム値]
WHERE
[主キー列] % @seed = @counter
SET @counter = @counter + 1
END
ランダム値の設定方法の一例
RandomItem
SELECT
--文字列
CONCAT(
--必要な文字数分繋げる
SUBSTRING('abcdefghijklmnopqrstuvwxyz0123456789', CONVERT(int, (CEILING(RAND() * 36))), 1),
SUBSTRING('abcdefghijklmnopqrstuvwxyz0123456789', CONVERT(int, (CEILING(RAND() * 36))), 1)
)
--数値(0~設定した最大値)
CONVERT(int, (CEILING(RAND() * [取得したい最大値])))
上手いこと工夫すれば外部キー制約とかチェック制約にも対応できそう