在SQL Server中创建测试数据

时间:2009-07-13 11:33:52

标签: sql-server testing

是否有人拥有或知道将为给定表生成测试数据的SQL脚本?

理想情况下,它会查看表的模式,并根据每列的数据类型创建包含测试数据的行。

如果这不存在,其他人会发现它有用吗?如果是这样的话,我会把手指伸出来写一个。

6 个答案:

答案 0 :(得分:13)

好吧,我以为我会把手指拉出来给自己写一个轻量级数据生成器:

declare @select varchar(max), @insert varchar(max), @column varchar(100),
    @type varchar(100), @identity bit, @db nvarchar(100)

set @db = N'Orders'
set @select = 'select '
set @insert = 'insert into ' + @db + ' ('


declare crD cursor fast_forward for
select column_name, data_type, 
COLUMNPROPERTY(
    OBJECT_ID(
       TABLE_SCHEMA + '.' + TABLE_NAME), 
    COLUMN_NAME, 'IsIdentity') AS COLUMN_ID
from Northwind.INFORMATION_SCHEMA.COLUMNS
where table_name = @db


open crD
fetch crD into @column, @type, @identity

while @@fetch_status = 0
begin
if @identity = 0 or @identity is null
begin
    set @insert = @insert + @column + ', ' 
    set @select = @select  + 
        case @type
            when 'int' then '1'
            when 'varchar' then '''test'''
            when 'nvarchar' then '''test'''
            when 'smalldatetime' then 'getdate()'
            when 'bit' then '0'
            else 'NULL'
        end + ', ' 
end
fetch crD into @column, @type, @identity
end 

set @select = left(@select, len(@select) - 1)
set @insert = left(@insert, len(@insert) - 1) + ')'
exec(@insert + @select)

close crD
deallocate crD

给定任何表,脚本将创建一个记录,其中包含类型的一些任意值; int,varchar,nvarchar,smalldatetime和bit。 case语句可以用函数替换。它不会依赖于依赖关系,但会跳过任何种子列。

我创建这个的动机是针对一个包含大约50列的表来测试我的NHibernate映射文件,所以我想了一个可以重复使用的简单脚本。

答案 1 :(得分:7)

您是否尝试过ApexSQL Generate:https://www.apexsql.com/sql_tools_generate.aspx

在我自己搜索类似的东西时偶然发现它,它完成了很好的工作。它不是免费的,但是您可以获得所有可用功能的免费试用版,因此您可以在购买前试用。

我认为它会很好地满足您的需求,因为它会跟踪表,列类型甚至约束之间的关系(对于更复杂的数据库)。

我喜欢(并且实际需要)的一件事是它具有实际名称,地址等的内置值。当查询创建的测试数据而不是随机字符串时,它有很多帮助。

此外,您可以导出到SQL(或其他几种格式)并随时使用创建的数据来重新填充数据库。

答案 2 :(得分:5)

来自red gate software的程序会为您执行此操作。它被称为SQL Data Generator

答案 3 :(得分:2)

某些版本的Visual Studio内置了数据生成功能。 如果您在其中使用数据库项目,则可以创建数据生成计划。这是MSDN文章

答案 4 :(得分:1)

我使用以下方式它基本上从自身复制数据,数据随着每次执行呈指数级增长.Claveat是你必须首先拥有一些样本数据,你还必须执行查询,例如我有327680行数据时我开始使用10行数据。通过执行查询只执行16次。再次执行一次,我会产生655360行数据!

 insert into mytable select [col1], [col2], [col3] from mytable 

答案 5 :(得分:0)

我们需要逐步创建查询表,以获取需要输入的数据。我使用下面的代码,逐步插入测试数据:

1。创建表格:

CREATE TABLE dbo.TestTableSize
(
    MyKeyField VARCHAR(10) NOT NULL,
    MyDate1 DATETIME NOT NULL,
    MyDate2 DATETIME NOT NULL,
    MyDate3 DATETIME NOT NULL,
    MyDate4 DATETIME NOT NULL,
    MyDate5 DATETIME NOT NULL
)

2。变量声明

DECLARE @RowCount INT
DECLARE @RowString VARCHAR(10)
DECLARE @Random INT
DECLARE @Upper INT
DECLARE @Lower INT
DECLARE @InsertDate DATETIME

3。按时设置:

SET @Lower = -730
SET @Upper = -1
SET @RowCount = 0

4。填充表格:

WHILE @RowCount < 3000000
BEGIN

5。准备值

SET @RowString = CAST(@RowCount AS VARCHAR(10))

    SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)

    SET @InsertDate = DATEADD(dd, @Random, GETDATE())

6。撰写插入声明:

INSERT INTO TestTableSize
        (MyKeyField
        ,MyDate1
        ,MyDate2
        ,MyDate3
        ,MyDate4
        ,MyDate5)
    VALUES
        (REPLICATE('0', 10 - DATALENGTH(@RowString)) + @RowString
        , @InsertDate
        ,DATEADD(dd, 1, @InsertDate)
        ,DATEADD(dd, 2, @InsertDate)
        ,DATEADD(dd, 3, @InsertDate)
        ,DATEADD(dd, 4, @InsertDate))

    SET @RowCount = @RowCount + 1
END

7。完整的代码:

DECLARE @RowCount INT
DECLARE @RowString VARCHAR(10)
DECLARE @Random INT
DECLARE @Upper INT
DECLARE @Lower INT
DECLARE @InsertDate DATETIME

SET @Lower = -730
SET @Upper = -1
SET @RowCount = 0

WHILE @RowCount < 3000000
BEGIN
    SET @RowString = CAST(@RowCount AS VARCHAR(10))
    SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
    SET @InsertDate = DATEADD(dd, @Random, GETDATE())

    INSERT INTO TestTableSize
        (MyKeyField
        ,MyDate1
        ,MyDate2
        ,MyDate3
        ,MyDate4
        ,MyDate5)
    VALUES
        (REPLICATE('0', 10 - DATALENGTH(@RowString)) + @RowString
        , @InsertDate
        ,DATEADD(dd, 1, @InsertDate)
        ,DATEADD(dd, 2, @InsertDate)
        ,DATEADD(dd, 3, @InsertDate)
        ,DATEADD(dd, 4, @InsertDate))

    SET @RowCount = @RowCount + 1
END