我如何自动化SQL Server Management Studio 2008中的“生成脚本”任务?
我想在SQL Server Management Studio 2008中自动生成脚本。
现在我所做的是:
- 右键点击我的数据库,任务,“生成脚本…”
- 手动select我需要的所有导出选项,然后在“select对象”选项卡上单击全选
- select导出文件夹
- 最后点击“完成”button
有没有办法自动执行这个任务?
编辑:我想生成创build脚本,而不是更改脚本。
从Visual Studio 2008 SP1团队套件中提到的Brann是数据库发布向导的1.4版。 它与SQL Server 2008(也许只有专业?)安装到\ ProgramFiles \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4。 来自服务器资源pipe理器的VS调用只是简单地调用它 您可以通过命令行实现相同的function,如:
sqlpubwiz help script
我不知道v1.4是否和V1.1有相同的麻烦(用户转换为angular色,约束不是按照正确的顺序创build的),但是这不是我的解决scheme,因为它没有脚本对象到不同的文件,如SSMS中的任务 – >生成脚本选项。 我目前正在使用修改后的Scriptio版本(使用MS SMO API)作为数据库发布向导(sqlpubwiz.exe)的改进替代品。 目前它不是从命令行编写的,我可以在未来添加这个贡献。
Scriptio最初是在Bill Graziano的博客上发布的,但随后被Bill发布到CodePlex,并由其他人更新。 阅读讨论,看看如何编译使用SQL Server 2008。
编辑:我已经开始使用RedGate的SQL比较产品来做到这一点。 这是一个很好的替代所有的SQL发布向导应该。 您select一个数据库,备份或快照作为源,并select一个文件夹作为输出位置,并将所有内容都转储到文件夹结构中。 它恰好与其他产品(SQL源代码pipe理)使用的格式相同。
与SSMS中的脚本生成相比,SqlPubwiz的选项非常有限。 相比之下, SMO的选项与SSMS中的选项几乎完全一致,表明它甚至可能是相同的代码。 (我希望MS没有写两遍!)MSDN上有几个像这样的例子,将脚本表显示为单独的对象。 但是,如果您希望所有脚本都正确地使用包含'DRI'(声明式参照完整性)对象(如外键)的“完整”模式进行脚本编写,那么单独编写脚本表不会正确执行依赖关系。 我发现收集所有的URNs并把它们作为一个数组传递给scripter是必要的。 这个代码,从这个例子中修改,适用于我(虽然我敢说,你可以整理它,并评论一下):
using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Sdk.Sfc; ... // Connect to the local, default instance of SQL Server. Server srv = new Server(); // Reference the database. Database db = srv.Databases["YOURDBHERE"]; Scripter scrp = new Scripter(srv); scrp.Options.ScriptDrops = false; scrp.Options.WithDependencies = true; scrp.Options.Indexes = true; // To include indexes scrp.Options.DriAllConstraints = true; // to include referential constraints in the script scrp.Options.Triggers = true; scrp.Options.FullTextIndexes = true; scrp.Options.NoCollation = false; scrp.Options.Bindings = true; scrp.Options.IncludeIfNotExists = false; scrp.Options.ScriptBatchTerminator = true; scrp.Options.ExtendedProperties = true; scrp.PrefetchObjects = true; // some sources suggest this may speed things up var urns = new List<Urn>(); // Iterate through the tables in database and script each one foreach (Table tb in db.Tables) { // check if the table is not a system table if (tb.IsSystemObject == false) { urns.Add(tb.Urn); } } // Iterate through the views in database and script each one. Display the script. foreach (View view in db.Views) { // check if the view is not a system object if (view.IsSystemObject == false) { urns.Add(view.Urn); } } // Iterate through the stored procedures in database and script each one. Display the script. foreach (StoredProcedure sp in db.StoredProcedures) { // check if the procedure is not a system object if (sp.IsSystemObject == false) { urns.Add(sp.Urn); } } StringBuilder builder = new StringBuilder(); System.Collections.Specialized.StringCollection sc = scrp.Script(urns.ToArray()); foreach (string st in sc) { // It seems each string is a sensible batch, and putting GO after it makes it work in tools like SSMS. // Wrapping each string in an 'exec' statement would work better if using SqlCommand to run the script. builder.AppendLine(st); builder.AppendLine("GO"); } return builder.ToString();
您可以使用SQL Serverpipe理对象(SMO)自动化SQL Server 2005pipe理任务,包括生成脚本: http : //msdn.microsoft.com/en-us/library/ms162169.aspx 。
我编写了一个名为SchemaZen的开源命令行实用程序,它可以实现这一点。 它比来自pipe理工作室的脚本要快得多,而且它的输出对版本控制更友好。 它支持模式和数据的脚本。
要生成脚本运行:
schemazen.exe脚本--server localhost --database db --scriptDir c:\ somedir
然后从脚本运行重新创build数据库:
schemazen.exe create --server localhost --database db --scriptDir c:\ somedir
如果你是一个开发人员,一定要去SMO。 这是一个链接到Scripter类,这是你的出发点:
Scripter类
我没有看到任何这些答案中提到的SQLPSX powershell …我个人没有玩过它,但它看起来非常简单,使用和理想的适合这种types的自动化任务,与任务如:
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlTable | Get-SqlScripter | Set-Content -Path C:\script.sql Get-SqlDatabase -dbname test -sqlserver server | Get-SqlStoredProcedure | Get-SqlScripter Get-SqlDatabase -dbname test -sqlserver server | Get-SqlView | Get-SqlScripter
(ref: http : //www.sqlservercentral.com/Forums/Topic1167710-1550-1.aspx#bm1168100 )
项目页面: http : //sqlpsx.codeplex.com/
这种方法的主要优点是,它将直接使用SMO的可configuration性/可定制性与使用简单的现有工具(如数据库发布向导)的便利性和可维护性结合起来。
在“工具”>“选项”>“devise器”>“表格和数据库devise器”中,可以select“自动生成更改脚本”,以便在保存时生成一个更改。
您可以使用INFORMATION_SCHEMA表使用T-SQL代码来完成。
还有第三方工具 – 我喜欢Apex SQL脚本正是为了您正在谈论的用途。 我从命令行完全运行它。
如果您想要一个Microsoft解决scheme,您可以尝试:Microsoft SQL Server数据库发布向导1.1
它创build了一个批处理过程,您可以随时运行需要重build的脚本。
我一直在使用数据库比较器 – 它的免费,没有大惊小怪的整个数据库,可以比较另一个数据库,也产生一个差异脚本。 非常适合开发生产更改脚本。 http://www.dbcomparer.com/
还有这个简单的命令行工具,我build立我的需要。
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/
它可以导出整个数据库,并尝试导出encryption的对象。 一切都存储在文件夹和单独的SQL文件,方便文件比较。
代码也可以在github上find。
从Visual Studio 2008 SP1 TeamSuite:
在“服务器资源pipe理器/数据连接”选项卡中,有一个“发布到提供程序”工具,它与“Microsoft SQL Server数据库发布向导”具有相同的function,但与MS Sql Server 2008兼容。
我正在使用VS 2012(对于MSSQL Server 2008上的DB)比较数据库有一个选项来保存它,比较和选项。 这基本上是你的交付设置。 之后,你可以做更新或生成脚本。
我发现稍后从文件加载它(从Windows资源pipe理器拖放)它有点尴尬,因为我没有在解决scheme资源pipe理器中看到该文件。