我们正在编写一个新的应用程序,在进行测试时,我们将需要一堆虚拟数据。我已经通过使用MS Access将excel文件转储到相关表中添加了这些数据。

每隔一段时间,我们想要“刷新”相关的表,这意味着将它们全部删除,重新创建它们,并运行已保存的MS Access追加查询。

第一部分(删除和重新创建)是一个简单的sql脚本,但最后一部分让我畏缩。我想要一个单独的设置脚本,它有一堆insert来重新生成虚拟数据。

我现在有数据在表格里。从该数据集自动生成一个大的INSERT语句列表的最佳方法是什么?

我能想到的唯一方法是将表保存到excel表格中,然后编写excel公式为每一行创建一个INSERT,这肯定不是最好的方法。

我使用2008 Management Studio连接到SQL Server 2005数据库。


当前回答

为了获得带有过滤记录的INSERT语句(WHERE QUERY),您可以

右击表脚本表>创建到>新的查询 用temp_table重命名 现在运行 选择到temp_table从你的第一个表,现在你的标准在这里

这样你的临时表将只有你想要的记录, 现在通过运行由@Mike Ritacco with DATA ONLY解释的脚本向导,您将得到确切的插入语句。

其他回答

为什么不只是在使用数据之前备份数据,然后在需要刷新数据时进行恢复呢?

如果必须生成插入,请尝试:http://vyaskn.tripod.com/code.htm#inserts

我对这个问题的贡献是一个Powershell INSERT脚本生成器,它允许您为多个表编写脚本,而不必使用麻烦的SSMS GUI。非常适合快速将“种子”数据持久化到源代码控制中。

将下面的脚本保存为“filename.ps1”。 对“自定义我”下的区域进行自己的修改。 您可以以任意顺序将表列表添加到脚本中。 您可以在Powershell ISE中打开脚本并点击播放按钮,或者简单地在Powershell命令提示符中执行脚本。

默认情况下,生成的INSERT脚本将是“SeedData”。与脚本相同的文件夹下。

您需要安装SQL Server管理对象程序集,如果您安装了SSMS,则应该安装该程序集。

Add-Type -AssemblyName ("Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
Add-Type -AssemblyName ("Microsoft.SqlServer.ConnectionInfo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")



#CUSTOMIZE ME
$outputFile = ".\SeedData.sql"
$connectionString = "Data Source=.;Initial Catalog=mydb;Integrated Security=True;"



$sqlConnection = new-object System.Data.SqlClient.SqlConnection($connectionString)
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection($sqlConnection)
$srv = new-object Microsoft.SqlServer.Management.Smo.Server($conn)
$db = $srv.Databases[$srv.ConnectionContext.DatabaseName]
$scr = New-Object Microsoft.SqlServer.Management.Smo.Scripter $srv
$scr.Options.FileName = $outputFile
$scr.Options.AppendToFile = $false
$scr.Options.ScriptSchema = $false
$scr.Options.ScriptData = $true
$scr.Options.NoCommandTerminator = $true

$tables = New-Object Microsoft.SqlServer.Management.Smo.UrnCollection



#CUSTOMIZE ME
$tables.Add($db.Tables["Category"].Urn)
$tables.Add($db.Tables["Product"].Urn)
$tables.Add($db.Tables["Vendor"].Urn)



[void]$scr.EnumScript($tables)

$sqlConnection.Close()

GenerateData是一个很棒的工具。对它进行调整也很容易,因为源代码是可用的。一些不错的功能:

用于人名和地名的名称生成器 能够保存生成配置文件(在本地下载和设置后) 能够通过脚本自定义和操作生成 数据的许多不同输出(CSV, Javascript, JSON等)(以防您需要在不同的环境中测试集,并希望跳过数据库访问) 免费的。但如果你觉得软件有用,可以考虑捐赠:)。

你可以用我几年前写的这个简单而免费的应用程序生成INSERT或MERGE语句: 数据脚本编写器(Windows桌面应用程序)

此外,我最近还写了一篇关于这些工具以及利用SSDT部署数据数据库的方法的博客文章。了解更多信息: 从SSDT项目为数据库编写脚本并部署数据

如果需要编程式访问,那么可以使用开源存储过程GenerateInsert。

插入语句生成器

作为一个简单而快速的例子,要为表AdventureWorks.Person.AddressType生成INSERT语句,执行以下语句:

USE [AdventureWorks];
GO
EXECUTE dbo.GenerateInsert @ObjectName = N'Person.AddressType';

这将生成以下脚本:

SET NOCOUNT ON
SET IDENTITY_INSERT Person.AddressType ON
INSERT INTO Person.AddressType
([AddressTypeID],[Name],[rowguid],[ModifiedDate])
VALUES
 (1,N'Billing','B84F78B1-4EFE-4A0E-8CB7-70E9F112F886',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(2,N'Home','41BC2FF6-F0FC-475F-8EB9-CEC0805AA0F2',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(3,N'Main Office','8EEEC28C-07A2-4FB9-AD0A-42D4A0BBC575',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(4,N'Primary','24CB3088-4345-47C4-86C5-17B535133D1E',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(5,N'Shipping','B29DA3F8-19A3-47DA-9DAA-15C84F4A83A5',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(6,N'Archive','A67F238A-5BA2-444B-966C-0467ED9C427F',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
SET IDENTITY_INSERT Person.AddressType OFF