LoginSignup
2
5

More than 5 years have passed since last update.

テーブルにランダムな値を設定する(SQL Server/T-SQL編)

Posted at

テストデータ作成するのに困ったので覚え書き

任意のテーブルに対してランダムな値を設定するための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() * [取得したい最大値])))

上手いこと工夫すれば外部キー制約とかチェック制約にも対応できそう

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5