是否有人拥有或知道将为给定表生成测试数据的SQL脚本?
理想情况下,它会查看表的模式,并根据每列的数据类型创建包含测试数据的行。
如果这不存在,其他人会发现它有用吗?如果是这样的话,我会把手指伸出来写一个。
答案 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