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

114

我希望能够在SQL Server Management Studio 2008中自动化脚本生成。

目前我的做法是:

  • 右键单击我的数据库,选择Tasks,"Generate Scripts..."
  • 手动选择我需要的所有导出选项,在"select object"选项卡上选择"select all"
  • 选择导出文件夹
  • 最后点击"Finish"按钮

是否有一种方法可以自动化此任务?

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


1
你找到答案了吗?我也想做这个,我使用了发布功能,它保存在硬盘上,但不知道在哪里,而且我没有生成脚本时拥有的所有选项 :-? - Alexa Adrian
2
正如其他答案中提到的那样,如果您是开发人员,请使用SMO。 - Jay Jay Jay
14个回答

52

与 SSMS 中的脚本生成相比,SqlPubwiz 的选项非常有限。相比之下,SMO 提供的选项几乎与 SSMS 完全一致,这表明它可能是完全相同的代码。(我希望微软没有重复编写它!)MSDN 上有几个示例,例如这个,展示了将表作为单独对象进行脚本处理的方式。然而,如果你想要包含“DRI”(声明性引用完整性)对象(如外键)的“完整”模式正确地进行脚本处理,则单独对表进行脚本处理无法正确解决依赖关系。我发现有必要收集所有 URN 并将它们作为数组交给脚本生成器。这段代码是从示例修改而来,对我很有效(尽管我敢说你可以更好地整理并注释它):

    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Sdk.Sfc;
    // etc...

    // 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();

10
你可以查看程序集C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\Microsoft.SqlServer.Management.SqlScriptPublishUI.dll中的类Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizard。这是SSMS使用的。(或者,你也可以查看程序集C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\ReplicationDialog.dll中的类Microsoft.SqlServer.Management.UI.GenerateScript。) - cubetwo1729
这里的示例代码和链接是一个很好的起点,应该是对OP(也就是我的确切问题)最完整的答案。 - zanlok
2
我破解了一个C#应用程序,它允许你在Linux命令行中生成SQL服务器脚本。你所需要的只是.Net Core 2预览版: https://github.com/mkurz/SQLServerScripter - mkurz

32

Brann所提到的来自Visual Studio 2008 SP1 Team Suite的内容是Database Publishing Wizard 1.4版本。它与SQL Server 2008一起安装(可能仅限于专业版),路径为\Program Files\Microsoft SQL Server\90\Tools\Publishing\1.4。通过服务器资源管理器调用VS只是简单地调用此程序。您可以通过命令行实现相同的功能,例如:

sqlpubwiz help script

我不知道v1.4是否存在与v1.1相同的问题(将用户转换为角色,约束未按正确顺序创建),但对我来说这不是一个解决方案,因为它不能像SSMS中的Tasks->Generate Scripts选项那样将对象脚本化到不同的文件中。我目前正在使用修改版的Scriptio(使用MS SMO API)作为数据库发布向导(sqlpubwiz.exe)的改进替代品。它目前无法从命令行脚本化,但我可能会在将来添加该贡献。

Scriptio最初发布在Bill Graziano的博客上,但随后由Bill和其他人发布到CodePlex并更新。请阅读讨论以了解如何编译以用于SQL Server 2008。

http://scriptio.codeplex.com/

编辑:我已经开始使用RedGate的SQL Compare产品来完成这项工作。它是应该具备的所有sql发布向导的非常好的替代品。您可以选择数据库、备份或快照作为源,将一个文件夹作为输出位置,然后将所有内容漂亮地倾泻到一个文件夹结构中。这恰好是他们的另一款产品SQL Source Control所使用的格式。


2012年有相应的等效物吗?如果向导记住了我的设置,比如“脚本索引”,我会很高兴的。 - PeterX
8
@PeterX SMSS > 工具 > 选项 > SQL Server对象资源管理器 > 脚本化 - zanlok
1
对于2012,请按照以下指南:https://www.simple-talk.com/sql/database-administration/automated-script-generation-with-powershell-and-smo/ - Simon Hutchison
@zanlok非常有用的评论。不幸的是,SQL Server 2014缺少“包括不支持的语句”选项。 - jk7
我已经将Scriptio CodePlex存储库分叉到GitHub https://github.com/fredatgithub/Scriptio - Fred Smith

23

我编写了一个名为SchemaZen的开源命令行实用程序,可以快速生成SQL Server对象脚本。它比从管理工具中进行脚本更快,并且其输出更适合版本控制。它支持对架构和数据进行脚本生成。

要生成脚本,请运行:

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

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

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

1
我刚试了SchemaZen,真的很印象深刻。第一次就成功了。谢谢Seth! - Simon Hughes
@Seth,你用什么脚本来编写对象?我没有看到任何关于Microsoft.SqlServer的引用(除了一个未使用的using语句)。 - John
@John - Schema Zen 包含自己的脚本库。它将模式读入模型,然后根据模型生成脚本。请参见 https://github.com/sethreno/schemazen/blob/master/model/Models/SqlUser.cs 以获取一个简单示例。 - Seth Reno

13

9
如果您是开发人员,建议使用SMO。这里有一个Scripter类的链接,它是您的起点:Scripter Class

7

我在这些答案中没有看到提到使用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的配置性/可定制性与使用像数据库发布向导这样的简单现有工具的便利性和可维护性相结合。


1
我花了一些时间尝试了这个解决方案,但最终还是转向使用C#和SMO。问题在于示例代码单独对每个表格进行脚本处理。当你开始添加'DRI'(声明性引用完整性)对象,如外键时,它就无法正确处理依赖关系,或者处理速度非常慢。 - OlduwanSteve

5
在“工具”>“选项”>“设计师”>“表和数据库设计师”中,有一个名为“自动生成更改脚本”的选项,它会在您保存更改时为每个更改生成一个脚本。请注意保留HTML标记。

5
不是我需要的准确内容。我想获取创建脚本(我的最终目标是将这些文件自动检入到源代码控制系统中)。 - Brann

4

你可以使用 INFORMATION_SCHEMA 表以 T-SQL 代码的形式进行操作。

还有第三方工具 - 我喜欢 Apex SQL Script,它非常适合你所说的用途。我完全从命令行运行它。


4

2
很遗憾,它不支持 SqlServer 2008。 - Brann
2
版本1.2声称支持2000和2005,但我刚刚使用它在2008上编写了一个拥有3800多个表的数据库脚本,并且运行良好。它不包括压缩选项,这是直到2008才引入的。我还测试了针对2008 R2数据库的脚本,也能正常工作。 - Jeremy

3
尝试使用新的SQL Server命令行工具生成T-SQL脚本并监视动态管理视图。对我非常有用。这是微软基于Python开发的新工具,可从命令行运行。所有操作都与Microsoft页面描述的一样(请参见下面的链接)。在我使用SQL 2012服务器时运行正常。 您可以通过pip安装它: $pip install mssql-scripter 像往常一样,使用-h获取命令参数概述: mssql-scripter -h 提示:如果通过Windows身份验证登录到SQL Server,请省略用户名和密码。

https://cloudblogs.microsoft.com/sqlserver/2017/05/17/try-new-sql-server-command-line-tools-to-generate-t-sql-scripts-and-monitor-dynamic-management-views/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接