Jos*_*ons 569 sql-server ssms code-generation
我们正在编写一个新的应用程序,在测试时,我们需要一堆虚拟数据.我通过使用MS Access将excel文件转储到相关表中来添加该数据.
我们经常要"刷新"相关表,这意味着将它们全部删除,重新创建它们,并运行已保存的MS Access追加查询.
第一部分(删除和重新创建)是一个简单的sql脚本,但最后一部分让我感到畏缩.我想要一个单一的安装脚本,它有一堆INSERT来重新生成虚拟数据.
我现在有表格中的数据.从该数据集自动生成大型INSERT语句列表的最佳方法是什么?
我能想到的唯一方法是将表保存到excel表,然后编写一个excel公式来为每一行创建一个INSERT,这肯定不是最好的方法.
我正在使用2008 Management Studio连接到SQL Server 2005数据库.
小智 971
Microsoft应该宣传SSMS 2008的此功能.您要查找的功能内置于Generate Script实用程序中,但默认情况下该功能处于关闭状态,并且必须在编写表脚本时启用该功能.
这是一个快速运行INSERT,为SQL Management Studio 2008中没有脚本或加载项生成表中所有数据的语句:
然后,您将直接从SSMS 获取该CREATE TABLE语句和所有INSERT数据语句.
Sha*_*mer 85
我们使用这个存储过程 - 它允许您定位特定的表,并使用where子句.你可以在这里找到文字.
例如,它允许您这样做:
EXEC sp_generate_inserts 'titles'
Run Code Online (Sandbox Code Playgroud)
noo*_*and 43
正如@Mike Ritacco所述,但针对SSMS 2008 R2进行了更新
然后,您将直接从SSMS获取数据的所有INSERT语句.
编辑2016-10-25 SQL Server 2016/SSMS 13.0.15900.1
右键单击数据库名称
选择"任务>生成脚本"
根据您的设置,可以显示或不显示介绍页面
选择"选择特定数据库对象",
展开树视图并检查相关表
点击下一步
单击高级
在"常规"部分下,为"脚本数据类型"选择适当的选项
单击确定
选择是否要将输出转到新查询,剪贴板或文件
单击下一步两次
您的脚本是根据您在上面选择的设置准备的
单击完成
Mar*_*tin 40
这也可以使用Visual Studio(至少在2013版本以后).
在VS 2013中,还可以过滤 insert语句所基于的行列表,这在SSMS中是不可能的,因为我知道.
执行以下步骤:
这将为选定的表创建(条件)插入语句到活动窗口或文件.
"过滤器"和"脚本"按钮Visual Studio 2013:
Eri*_*est 23
我正在使用SSMS 2008版本10.0.5500.0.在此版本中,作为Generate Scripts向导的一部分,而不是Advanced按钮,下面是屏幕.在这种情况下,我只想插入数据而没有创建语句,因此我不得不更改两个带圆圈的属性
har*_*ott 13
Jane Dallaway的存储过程:http://docs.google.com/leaf?id = 0B_AkC4ZdTI9tNWVmZWU3NzAtMWY1My00NjgwLWI3ZjQtMTY1NDMxYzBhYzgx&hl = en_GB .文档是一系列博客文章: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)
Run Code Online (Sandbox Code Playgroud)
在我的系统上,我得到了这个结果:
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
...
Run Code Online (Sandbox Code Playgroud)
如果需要编程访问,则可以使用开源存储过程GenerateInsert.
就像一个简单快速的例子一样,为表生成INSERT语句AdventureWorks.Person.AddressType执行以下语句:
USE [AdventureWorks];
GO
EXECUTE dbo.GenerateInsert @ObjectName = N'Person.AddressType';
Run Code Online (Sandbox Code Playgroud)
这将生成以下脚本:
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
Run Code Online (Sandbox Code Playgroud)
我对这个问题的贡献,一个Powershell INSERT脚本生成器,它允许您编写脚本多个表而无需使用繁琐的SSMS GUI.非常适合将"种子"数据快速保存到源代码管理中.
默认情况下,生成的INSERT脚本将与脚本位于同一文件夹下的"SeedData.sql".
您将需要安装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()
Run Code Online (Sandbox Code Playgroud)
GenerateData是一个了不起的工具。对其进行调整也非常容易,因为您可以使用源代码。几个不错的功能:
为了获得带有过滤记录的 INSERT 语句(WHERE QUERY),您可以
右键单击表脚本表为 > 创建到 > 新查询
使用 TEMP_TABLE 重命名它
现在运行
从您的第一个表中选择 TEMP_TABLE,现在您的标准在这里
通过这种方式,您的临时表将只包含您想要的记录,现在通过运行脚本向导(如@Mike Ritacco所解释) ,仅使用 DATA,您将获得准确的插入语句。
| 归档时间: |
|
| 查看次数: |
449685 次 |
| 最近记录: |