如何自动化SQL Server Management Studio 2008中的“生成脚本”任务?

问题描述:

我想在SQL Server Management Studio 2008中如何自动化SQL Server Management Studio 2008中的“生成脚本”任务?

现在我做什么来自动生成脚本是:

  • 右键单击我的数据库,任务,“生成脚本...”
  • 手动选择我需要的所有导出选项,并点击选择所有的“选择对象”选项卡
  • 在选择导出文件夹
  • 最后点击“完成”按钮

有没有办法让这个任务自动化?

编辑:我想生成创建脚本,而不是更改脚本。

+0

您是否找到答案?我也想这样做,我用Publishing,它很难保存,不知道在哪里,哪里没有生成脚本时的所有选项: - ? – 2012-07-12 12:37:48

+1

正如在几个答案中提到的那样,如果您是开发人员,请使用SMO – 2014-04-16 21:53:07

从Visual Studio 2008 SP1团队套件中提及的Brann是数据库发布向导的1.4版。它与sql server 2008(可能只有专业?)一起安装到\ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4。来自服务器浏览器的VS调用只是简单地调用它。您可以通过像在命令行中实现相同的功能:

sqlpubwiz help script 

我不知道是否V1.4具有V1.1做(用户转换为角色相同的烦恼,在不创建的约束但它不是我的解决方案,因为它不会将对象编写到不同的文件,如SSMS中的任务 - >生成脚本选项。我目前使用修改后的Scriptio版本(使用MS SMO API)作为数据库发布向导(sqlpubwiz.exe)的改进替代品。目前它还没有从命令行编写脚本,我可能会在未来添加该贡献。

Scriptio最初是在Bill Graziano的博客上发布的,但随后由Bill发布到CodePlex并由其他人更新。阅读讨论,看看如何编译使用与SQL Server 2008

http://scriptio.codeplex.com/

编辑:我用展鹏的SQL比较产品来做到这一点,因为开始。这是一个很好的替代所有的SQL发布向导应该。您选择数据库,备份或快照作为源,并选择一个文件夹作为输出位置,并将所有内容都转储到文件夹结构中。它恰好与他们的其他产品SQL Source Control使用的格式相同。

+0

2012年有没有相当于?如果向导记住我的设置(如“脚本索引”),我会很高兴。 – PeterX 2014-03-06 07:06:02

+6

@PeterX SMSS>工具>选项> SQL Server对象浏览器>脚本 – zanlok 2015-08-20 15:48:10

在工具>选项>设计人员>表格和数据库设计人员中,有一个“自动生成更改脚本”选项,可以在您保存时为每次更改生成一个选项。

+2

这不完全是我需要的。我想获取创建脚本(我的最终目标是自动将这些文件签入我的源代码管理系统) – Brann 2009-01-27 14:33:13

您可以使用INFORMATION_SCHEMA表使用T-SQL代码执行此操作。

还有第三方工具 - 我喜欢Apex SQL脚本,正是为了您正在谈论的使用。我从命令行完全运行它。

您可以使用SQL Server管理对象(SMO)自动化SQL Server 2005管理任务,包括生成脚本:http://msdn.microsoft.com/en-us/library/ms162169.aspx

如果你想微软解决方案,你可以尝试:Microsoft SQL Server数据库发布向导1.1

http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

它创建一个批处理过程中,你可以随时随地运行您需要重建的脚本。

+1

不幸的是,它不支持SqlServer 2008 – Brann 2009-01-27 15:02:55

+1

版本1.2说它支持2000和2005,但我只是用它在2008年使用3800多个表格编写数据库脚本,并且工作正常。它没有包括压缩选项,直到2008年才推出。我也刚刚测试了2008 R2数据库,它的脚本也很好。 – Jeremy 2014-10-31 23:04:40

如果你是一名开发人员,一定要去SMO。这里有一个链接到的编剧类,这是你的出发点:

Scripter Class

在Visual Studio 2008 SP1 TeamSuite:

在服务器资源管理器/数据连接选项卡上,有一个发布到供应商的工具,与“Microsoft SQL Server数据库发布向导”相同,但与MS Sql Server 2008兼容。

+0

它如何帮助自动执行任务? – 2010-09-11 15:28:57

我没有看到任何这些答案中提到的SQLPSX powershell ...我个人没有玩过它,但它看起来非常简单易用,非常适合这种类型的自动化任务,其任务如下:

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 

(参照http://www.sqlservercentral.com/Forums/Topic1167710-1550-1.aspx#bm1168100

项目页面:http://sqlpsx.codeplex.com/

这种方法的主要优点是,它结合使用直接SMO的configurablity /定制,与CONV使用简单的现有工具(如数据库发布向导)的高度和可维护性。

我一直在使用DB的Comparer - 它的*,没有什么大惊小怪的脚本整个数据库,可以比较不同的数据库,也产生差异的脚本。非常适合开发生产更改脚本。 http://www.dbcomparer.com/

与SSMS中的脚本生成相比,SqlPubwiz的选项非常有限。相比之下,SMO的选项与SSMS中的选项几乎完全一致,表明它可能甚至是相同的代码。 (我希望MS不会写两遍!)在MSDN上有几个例子,如this one,它们将脚本表显示为单独的对象。但是,如果您希望所有脚本都使用包含'DRI'(声明式参照完整性)对象(如外键)的'完整'模式正确编写脚本,则单独编写脚本表不会正确执行依赖关系。我发现收集所有的URN并将它们作为一个数组传递给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(); 

我写了一个名为SchemaZen一个开源的命令行工具,做到这一点。它比来自management studio的脚本要快得多,它的输出对版本控制更友好。它支持模式和数据的脚本。

若要生成脚本运行:

schemazen.exe script --server localhost --database db --scriptDir c:\somedir

然后重新创建数据库从脚本运行:

schemazen.exe create --server localhost --database db --scriptDir c:\somedir

也有这个简单的命令行工具,我建立我的需要。
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

它可以导出整个数据库,并尝试导出加密对象。一切都存储在文件夹和单独的SQL文件,以便于文件比较。

代码也可以在github上找到。

我正在使用VS 2012(对于MSSQL Server 2008上的DB)比较数据库有一个选项来保存它,比较和选项。这基本上是你的交付设置。之后,你可以做更新或生成脚本。

我只是觉得有点尴尬,稍后从文件加载它(拖放从Windows资源管理器),因为我没有在解决方案资源管理器中看到该文件。