为SQL Server表自动生成INSERT语句的最佳方法是什么?
我们正在编写一个新的应用程序,而在testing的时候,我们将需要大量的虚拟数据。 我已经使用MS Access将这些数据添加到相关的表中。
每隔一段时间,我们都要“刷新”相关表格,这意味着将其全部删除,重新创build它们,并运行已保存的MS Access追加查询。
第一部分(删除和重新创build)是一个简单的SQL脚本,但最后一部分让我畏惧。 我想要一个安装脚本,有一堆插入重新生成虚拟数据。
我现在有表格中的数据。 从数据集自动生成大量INSERT语句的最佳方法是什么?
我想在TOAD(对于Oracle)的东西,你可以右键单击一个网格,然后单击另存为 – >插入语句,它只会转储一个大的SQL脚本,无论你想要的地方。
我能想到的唯一方法就是将表格保存到Excel表格中,然后编写一个Excel公式为每一行创build一个INSERT,这当然不是最好的方法。
我正在使用2008 Management Studio连接到SQL Server 2005数据库。
微软应该宣传SSMS 2008的这个function。你正在寻找的function被内置到生成脚本实用程序中,但是这个function在默认情况下是closures的,并且在编写脚本时必须启用。
这是一个快速运行的过程,为您的表中的所有数据生成INSERT
语句,不使用SQL Management Studio 2008的脚本或加载项:
- 右键单击数据库,然后转到“ 任务” >“ 生成脚本” 。
- select要生成脚本的表(或对象)。
- 转到设置脚本选项选项卡,然后单击高级button。
- 在“ 常规”类别中,转到“ 脚本数据的types”
- 有3个选项: Schema Only , Data Only , Schema和Data 。 select适当的选项,然后单击确定 。
然后,您将直接从SSMS获取CREATE TABLE
语句和所有的INSERT
语句。
我们使用这个存储过程 – 它允许你定位特定的表,并使用where子句。 你可以在这里find文字。
例如,它可以让你这样做:为表'titles'生成INSERT语句:
EXEC sp_generate_inserts 'titles'
正如@Mike Ritacco提到的,但更新为SSMS 2008 R2
- 右键点击数据库名称
- select任务>生成脚本
- 介绍页面可能会显示或不显示,具体取决于您的设置
- select“select特定的数据库对象”,
- 展开树视图并检查相关的表
- 点击下一步
- 点击高级
- 在“常规”部分下,select“脚本数据的types”
- 完成向导
然后您将直接从SSMS获取所有的INSERT语句。
编辑2016-10-25 SQL Server 2016 / SSMS 13.0.15900.1
-
右键点击数据库名称
-
select任务>生成脚本
-
介绍页面可能会显示或不显示,具体取决于您的设置
-
select“select特定的数据库对象”,
-
展开树视图并检查相关的表
-
点击下一步
-
点击高级
-
在“常规”部分下,select“适用于脚本的数据types”
-
点击OK
-
select是否要输出到一个新的查询,剪贴板或文件
-
点击下一步两次
-
您的脚本根据您在上面select的设置进行准备
-
点击完成
您可以使用SSMS工具包(适用于SQL Server 2005和2008)。 它带有一个用于生成插入语句的function。
我正在使用SSMS 2008版本10.0.5500.0。 在这个版本中,作为“生成脚本”向导的一部分,而不是“高级”button,下面是一个屏幕。 在这种情况下,我只想插入数据,不需要创build语句,所以我必须更改两个圈出来的属性
这也可以使用Visual Studio
来完成(至less在版本2013以后)。
在VS 2013中,也可以过滤插入语句所基于的行列表,这在SSMS中是不可能的,就我所知。
执行以下步骤:
- 打开“SQL Server对象资源pipe理器”窗口(菜单:/ View / SQL Server对象资源pipe理器)
- 打开/展开数据库及其表格
- 右键单击表格并从上下文菜单中select“查看数据”
- 这将显示在主要区域的数据
- 可选步骤:点击filter图标“sorting和过滤数据集”(结果上方的行左侧的第四个图标),并将一些filter应用于一列或多列
- 点击“脚本”或“脚本到文件”图标(上排右侧的图标,它们看起来像小纸片)
这将创build所选表的(条件)插入语句到活动窗口或文件。
“筛选器”和“脚本”buttonVisual Studio 2013 :
Jane Dallaway的存储过程: http ://docs.google.com/leaf?id=0B_AkC4ZdTI9tNWVmZWU3NzAtMWY1My00NjgwLWI3ZjQtMTY1NDMxYzBhYzgx&hl=zh_CN。 文档是一系列博客文章: https : //www.google.com/search?q=spu_generateinsert&as_sitesearch=http%3A%2F%2Fjane.dallaway.com
第一个链接到sp_generate_inserts是非常酷的,这里是一个非常简单的版本:
DECLARE @Fields VARCHAR(max); SET @Fields = '[QueueName], [iSort]' -- your fields, keep [] DECLARE @Table VARCHAR(max); SET @Table = 'Queues' -- your table DECLARE @SQL VARCHAR(max) SET @SQL = 'DECLARE @S VARCHAR(MAX) SELECT @S = ISNULL(@S + '' UNION '', ''INSERT INTO ' + @Table + '(' + @Fields + ')'') + CHAR(13) + CHAR(10) + ''SELECT '' + ' + REPLACE(REPLACE(REPLACE(@Fields, ',', ' + '', '' + '), '[', ''''''''' + CAST('),']',' AS VARCHAR(max)) + ''''''''') +' FROM ' + @Table + ' PRINT @S' EXEC (@SQL)
在我的系统上,我得到了这个结果:
INSERT INTO Queues([QueueName], [iSort]) SELECT 'WD: Auto Capture', '10' UNION SELECT 'Car/Lar', '11' UNION SELECT 'Scan Line', '21' UNION SELECT 'OCR', '22' UNION SELECT 'Dynamic Template', '23' UNION SELECT 'Fix MICR', '41' UNION SELECT 'Fix MICR (Supervisor)', '42' UNION SELECT 'Foreign MICR', '43' UNION ...
如果您需要编程访问,则可以使用开源存储过程GenerateInsert。
INSERT语句生成器
就像一个简单而快速的例子,为一个表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
也许您可以尝试SQL Server发布向导http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en
它有一个向导,可以帮助你脚本插入语句。
我对这个问题的贡献是一个Powershell INSERT脚本生成器,它使您可以脚本化多个表,而无需使用繁琐的SSMS GUI。 非常适合将“种子”数据快速持久化到源代码pipe理中。
- 将下面的脚本保存为“filename.ps1”。
- 对“CUSTOMIZE ME”下的区域进行自己的修改。
- 您可以以任何顺序将脚本列表添加到脚本中。
- 您可以在Powershell ISE中打开脚本并点击“播放”button,或者只需在Powershell命令提示符下执行该脚本即可。
默认情况下,生成的INSERT脚本将与脚本位于同一文件夹下的“SeedData.sql”。
您将需要安装SQL Serverpipe理对象程序集,如果您安装了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()
不要使用插入,使用BCP
我用这个脚本放在我的博客上( 如何在sql server上生成插入语句程序 )。
到目前为止我已经为我工作,虽然他们可能是我还没有发现的错误。
GenerateData是一个了不起的工具。 因为源代码是可用的,所以也很容易做出调整。 一些不错的function:
- 人名和地名的名称发生器
- 能够保存Generationconfiguration文件(在本地下载并设置后)
- 能够通过脚本自定义和操作代
- 许多不同的输出(CSV,Javascript,JSON等)用于数据(如果您需要在不同的环境中testing集并且想跳过数据库访问)
- 免费 。 但考虑捐赠,如果你发现该软件有用:)。
我使用sqlite来做到这一点。 我发现它非常有用的创buildscratch / test数据库。
sqlite3 foo.sqlite .dump > foo_as_a_bunch_of_inserts.sql
为什么不在你的工作之前备份数据,然后在你想要刷新的时候恢复呢?
如果您必须生成插入尝试: http : //vyaskn.tripod.com/code.htm#inserts
不知道,如果我正确地理解你的问题。
如果MS-Access中有要将其移动到SQL Server的数据,则可以使用DTS。
而且,我想你可以使用SQL分析器来查看所有的INSERT语句。
你有生产数据库中的数据吗? 如果是这样,您可以通过DTS设置数据的周期刷新。 我们每周都会在周末做我们的工作,我们每周都有干净,真实的数据用于testing是非常好的。
如果你还没有生产,那么你应该创build一个他们想要的数据库(新鲜)。 然后,复制该数据库,并使用新创build的数据库作为testing环境。 当你想要干净的版本,只需复制你干净的一个, 鲍勃是你的叔叔 。
我也对此进行了很多研究,但是我无法得到具体的解决scheme。 目前我所遵循的方法是从SQL Server Managment studio复制excel中的内容,然后将数据导入Oracle-TOAD,然后生成插入语句