web-dev-qa-db-ja.com

データベースのすべてのテーブルにダミーデータを挿入するスクリプト

データベース内のすべてのテーブルとその列をループし、列のタイプとサイズに基づいてダミーデータを挿入できるスクリプトが欲しかったので、データベースをテストに使用したり、クエリやテストアプリを実行したりできます。

4
AmmarR

@AmmarRのソリューションが処理できない多くのケースがあります-_ROWVERSION/TIMESTAMP_、計算された列、チェック制約のある列、外部キー、UNIQUEIDENTIFIER列でデフォルトはNEWSEQUENTIALID()、日付/ time列のデフォルトはGETDATE()、スパース列などです。

なぜ車輪を再発明するのですか?あなたのためにデータを生成することができるツールがそこにあります、そして彼らはおそらくこれらすべての制限についてすでに考えています。たとえば DTM Data Generator (無料ではない、テストしていない)および Red-Gate SQL Data Generator (無料ではない、テストして推奨している-また ここで確認 )。

9
Aaron Bertrand

このタスクを完了するには、カーソルやSQL関数を使用するなど、さまざまでより良い方法があることを確認してください。タスクを完了する方法を共有することを考えました。

ダミーデータを挿入する挿入ステートメントを生成および実行するストアドプロシージャの作成を開始します。ストアドプロシージャは1つのパラメーターを受け取ります。パラメーターはnoです。すべてのテーブルに追加される行の数

スクリプトのロジックは単純で、_sys.columns_と_sys.types_を結合した_sys.tables_の選択

_sys.columns_はすべての列名を持っています_sys.types_は列のデータ型を持っています_sys.tables_はテーブル名を持っています。object_name(c.object_id)のようなテーブル名を取得する他の方法がありますが、 sys.columnsを_sys.tables_で結合する方が便利であること

以下はコードです

_Create PROCEDURE [dbo].[GenerateandExecuteInsertStatmentsforTables] 
    @NoOfRows int
AS
BEGIN

Declare @icount int
declare @qry varchar(max)
set @qry = ' '
set @icount = 0
while @icount < @NoOfRows
begin
    select @qry = @qry
    +
    case when c.column_id = 1 then
        'insert into ' + SCHEMA_NAME(t.schema_id) + '.[' + t.name + '] values('
    else
        ''
    end
    +
    -- incase the column is identity, i dont include it in the insert
    case when c.is_identity = 0 then
        case when ty.name in ('bit','bigint','int','smallint','tinyint','float','decimal','numeric','money','smallmoney','real') then
            substring(CAST(  round(Rand() * 1000,0) AS varchar),1,c.max_length)
        when ty.name in ('binary','varbinary') then
            substring('0x546869732069732044756D6D792044617461',1,c.max_length)
        when ty.name In ('varchar','char','text') then
            '''' + substring('Dummy This is Dummy Data',1,c.max_length)  + '''' 
        when ty.name In ('nchar','nvarchar','ntext') then
            '''' + substring('Dummy This is Dummy Data',1,c.max_length / 2)  + ''''             
        when ty.name in('date','time','datetime','datetime2','smalldatetime','datetimeoffset') then
            '''' + convert(varchar(50),dateadd(D,Round(Rand() * 1000,1),getdate()),121) + '''' 
        when ty.name in ('uniqueidentifier') then
            cast(NEWID() as varchar(33))
        else
            ''
        end
        + 
        case when c.column_id = (Select MAX(insc.column_id) from sys.columns insc where insc.OBJECT_ID = c.OBJECT_ID) then
            ');'
        else
            ','
        end
    else
        ''  
    end

    FROM sys.tables AS t
    INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
    INNER JOIN sys.types AS ty ON c.user_type_id=ty.user_type_id
    ORDER BY t.name,c.column_id; 
    set @icount = @icount + 1

    --execute the insert statments
    --Select (@qry)
    exec (@qry)
    Set @qry = ' ' 
end
_

その後、私はストアプロシージャを実行します

_USE [DBNAME]
EXEC [dbo].[GenerateandExecuteInsertStatmentsforTables] 5
_

これにより、データベース内のすべてのテーブルに5行が追加されます

3
AmmarR