データベース内のすべてのテーブルとその列をループし、列のタイプとサイズに基づいてダミーデータを挿入できるスクリプトが欲しかったので、データベースをテストに使用したり、クエリやテストアプリを実行したりできます。
@AmmarRのソリューションが処理できない多くのケースがあります-_ROWVERSION/TIMESTAMP
_、計算された列、チェック制約のある列、外部キー、UNIQUEIDENTIFIER
列でデフォルトはNEWSEQUENTIALID()
、日付/ time列のデフォルトはGETDATE()
、スパース列などです。
なぜ車輪を再発明するのですか?あなたのためにデータを生成することができるツールがそこにあります、そして彼らはおそらくこれらすべての制限についてすでに考えています。たとえば DTM Data Generator (無料ではない、テストしていない)および Red-Gate SQL Data Generator (無料ではない、テストして推奨している-また ここで確認 )。
このタスクを完了するには、カーソルや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行が追加されます