MSSQL脚本自动生成数据

介绍

在数据库测试、开发和管理过程中,我们需要随机生成大量的测试数据和实际数据。手动创建这些数据是一个耗时、无趣和容易出错的工作。在此情况下,自动化数据生成是一个值得思考的解决方案。

在MS SQL Server中,我们可以使用T-SQL语言和其他工具(如SQL Data Generator)来生成测试数据。但是,在快速生成数据时,可能还需要一种更高效、更灵活的方法。在本文中,我们将介绍一种新的方法,使用MSSQL脚本自动生成数据。

工作原理

该方法通过使用T-SQL、动态SQL和循环语句来生成数据。脚本读取表结构的元数据,如列名、数据类型、长度、键值等,并使用这些信息生成适当的数据。例如,如果列是日期类型,则会生成随机日期;如果列是数字类型,则会生成随机数字等。

具体实现步骤

1. 创建存储过程

在开始之前,我们需要创建一个存储过程,来生成数据。以下是示例代码:

--创建生成数据的存储过程

DROP PROCEDURE IF EXISTS p_generate_data;

GO

CREATE PROCEDURE p_generate_data

AS

BEGIN

DECLARE @table_name nvarchar(255)

DECLARE @sql nvarchar(max)

DECLARE @i int

--获取所有表名

DECLARE db_cursor CURSOR FOR

SELECT name

FROM sys.tables

OPEN db_cursor

FETCH NEXT FROM db_cursor INTO @table_name

WHILE @@FETCH_STATUS = 0

BEGIN

--生成SQL语句

SET @sql = N'INSERT INTO ' + @table_name + N'('

SELECT @sql = @sql + c.name + N', '

FROM sys.columns c

JOIN sys.tables t ON c.object_id = t.object_id

WHERE t.name = @table_name

AND c.column_id ! = 1

--去除sql语句中额外的逗号和空格

SET @sql = LEFT(@sql,LEN(@sql)-1)

SET @sql = @sql + N') VALUES('

SELECT @sql = @sql +

CASE

WHEN c.system_type_id IN (165,167,175,231,239) --字符类型

THEN '''' + REPLACE(LEFT(CONVERT(varchar,newid()),(LEN(newid())/2)), '-', '') + ''''

WHEN c.system_type_id IN (40,42,48,52,56,59,60,62,104,106,108,122,127,165,167,173,175,231,239) --数字、货币类型

THEN CONVERT(nvarchar(100), ABS(CHECKSUM(NEWID())) / 100000000.0)

WHEN c.system_type_id IN (58,61) --日期类型

THEN CONVERT(nvarchar(100),DATEADD(day, (ABS(CHECKSUM(NEWID())) % 65530) - 32765, GETDATE()),126) --考虑到日期型字段不能为null,此处不支持sql server 2000以下的版本

WHEN c.system_type_id IN (59,60) --浮点类型

THEN CONVERT(nvarchar(100), ABS(CHECKSUM(NEWID())) / 100000000.0, -1) --考虑到双精度浮点型不能为null,此处不支持sql server 2000以下的版本

END + N', '

FROM sys.columns c

JOIN sys.tables t ON c.object_id = t.object_id

WHERE t.name = @table_name

AND c.column_id ! = 1

--去除sql语句中额外的逗号和空格

SET @sql = LEFT(@sql,LEN(@sql)-1)

SET @sql = @sql + N')'

PRINT @sql

EXEC(@sql)

FETCH NEXT FROM db_cursor INTO @table_name

END

CLOSE db_cursor

DEALLOCATE db_cursor

END

GO

该存储过程使用游标迭代目标数据库的每个表,并生成INSERT语句插入数据。SQL语句的生成部分使用动态SQL,因此可以根据目标表的不同而动态调整。

2. 运行存储过程

现在,我们只需要运行存储过程即可生成数据。运行以下命令:

EXEC p_generate_data

该命令将生成所有表的测试数据,包括表中的所有列。数据是根据列类型自动填充的,因此生成的数据应具有合适的类型、范围和数据分布。

总结

MSSQL脚本自动化数据生成提供了一种灵活、可重复和自定义的方式来生成数据。使用T-SQL编写脚本,可以根据需要快速生成大量测试数据,并且可以方便地在不同的数据库中重复使用。此外,该方法还可以被扩展以改进数据生成器的功能,例如添加更高级的数据类型、约束和函数。

参考文章

- [Automate SQL Server Test Data Generation with PowerShell](https://www.red-gate.com/simple-talk/sql/database-administration/automate-sql-server-test-data-generation-with-powershell/)

- [SQL Server Automated Testing With PowerShell – Part 2](https://www.red-gate.com/simple-talk/sql/database-administration/sql-server-automated-testing-with-powershell-part-2/)

- [Generating Test Data in SQL Server with PowerShell](https://www.red-gate.com/simple-talk/sql/tools/generating-test-data-in-sql-server-with-powershell/)

数据库标签