【问题标题】:How can I automate the "generate scripts" task in SQL Server Management Studio 2008?如何在 SQL Server Management Studio 2008 中自动执行“生成脚本”任务?
【发布时间】:2009-01-27 14:24:14
【问题描述】:

我想在 SQL Server Management Studio 2008 中自动生成脚本。

现在我要做的是:

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

有没有办法自动完成这项任务?

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

【问题讨论】:

  • 你找到答案了吗?我也想这样做,我使用了 Publishing,它保存得很辛苦,不知道在哪里和那里我没有生成脚本时的所有选项:-?
  • 正如几个答案中提到的,如果您是开发人员,请使用 SMO

标签: sql-server visual-studio-2008 automation ssms sql-server-2008


【解决方案1】:

与 SSMS 中的脚本生成相比,SqlPubwiz 的选项非常有限。相比之下,SMO 提供的选项几乎与 SSMS 中的选项完全匹配,这表明它甚至可能是相同的代码。 (我希望 MS 没有写两次!)在 MSDN 上有几个示例,例如 this one,它们将脚本表显示为单个对象。但是,如果您希望使用包含“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();

【讨论】:

  • 可以从程序集 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。)
  • 这里的示例代码和链接是一个很好的开始,应该是对 OP 最完整的答案(这也是我的确切问题)。
  • 我开发了一个 C# 应用程序,它允许您从 Linux 的命令行生成 SQL 服务器脚本。您只需要 .Net Core 2 预览版:github.com/mkurz/SQLServerScripter
【解决方案2】:

Brann 在 Visual Studio 2008 SP1 Team Suite 中提到的是 1.4 版的数据库发布向导。它与 sql server 2008(也许只有专业版?)一起安装到 \Program Files\Microsoft SQL Server\90\Tools\Publishing\1.4。来自服务器资源管理器的 VS 调用只是调用它。您可以通过命令行实现相同的功能,例如:

sqlpubwiz help script

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

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

http://scriptio.codeplex.com/

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

【讨论】:

  • 2012 年有类似的吗?如果向导记得我的设置,如“脚本索引”,我会很高兴。
  • @PeterX SMSS > 工具 > 选项 > SQL Server 对象资源管理器 > 脚本
  • @zanlok 非常有用的评论。不幸的是,他们缺少 SQL Server 2014 中的“包括不受支持的语句”选项。
  • 我已将 scriptio codeplex 存储库分叉到 GitHub github.com/fredatgithub/Scriptio
【解决方案3】:

我编写了一个名为SchemaZen 的开源命令行实用程序来执行此操作。它比管理工作室的脚本要快得多,而且它的输出对版本控制更友好。它支持脚本模式和数据。

要生成脚本运行:

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

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

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

【讨论】:

  • 我刚刚尝试了 SchemaZen,我印象非常深刻。第一次工作。谢谢赛斯!
  • @Seth 那么你用什么来编写对象脚本呢?我没有看到对任何 Microsoft.SqlServer 的任何引用(嗯,有一个未使用的 using 语句)。
  • @John - Schema Zen 包含它自己的脚本库。它将模式读入模型,然后基于模型生成脚本。一个简单的例子见github.com/sethreno/schemazen/blob/master/model/Models/…
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    如果您是开发人员,一定要选择 SMO。这是 Scripter 类的链接,这是您的起点:

    Scripter Class

    【讨论】:

      【解决方案6】:

      我没有看到任何这些答案中提到的带有 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 的可配置性/可定制性,以及使用数据库发布向导等简单现有工具的便利性和可维护性。

      【讨论】:

      • 我花了一段时间尝试这个解决方案,但最后我转向了 C# 并使用了 SMO。我无法轻易找到过去的问题是示例代码分别为每个表编写脚本。一旦你开始添加像外键这样的“DRI”(声明性引用完整性)对象,它就不会得到正确的依赖关系和/或它会很慢。
      【解决方案7】:

      在“工具”>“选项”>“设计器”>“表和数据库设计器”中,有一个“自动生成更改脚本”选项,它将为您在保存时所做的每个更改生成一个。

      【讨论】:

      • 这不是我所需要的。我想获得创建脚本(我的最终目标是自动将这些文件签入到我的源代码控制系统中)
      【解决方案8】:

      您可以使用 INFORMATION_SCHEMA 表使用 T-SQL 代码来完成。

      还有第三方工具——我喜欢 Apex SQL Script 正是因为你正在谈论的用途。我完全从命令行运行它。

      【讨论】:

        【解决方案9】:

        如果您想要 Microsoft 解决方案,您可以尝试:Microsoft SQL Server Database Publishing Wizard 1.1

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

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

        【讨论】:

        • 很遗憾,它不支持 SqlServer 2008
        • Version 1.2 说它支持 2000 和 2005,但我只是用它在 2008 年为一个包含 3800 多个表的数据库编写脚本,它运行良好。它不包括压缩选项,直到 2008 年才引入。我还刚刚针对 2008 R2 数据库进行了测试,它的脚本也很好。
        【解决方案10】:

        尝试新的 SQL Server 命令行工具来生成 T-SQL 脚本并监控动态管理视图。

        像魅力一样为我工作。它是 Microsoft 的一个新的基于 python 的工具,可以从命令行运行。 一切都像微软页面上描述的那样工作(见下面的链接) 使用 SQL 2012 服务器为我工作。

        你用 pip 安装它:

        $pip 安装 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/

        【讨论】:

          【解决方案11】:

          我一直在使用 DB Comparer - 它的整个 DB 免费且无需大惊小怪的脚本,可以与另一个 DB 进行比较,还可以生成 Diff 脚本。非常适合从开发到生产更改脚本。 http://www.dbcomparer.com/

          【讨论】:

            【解决方案12】:

            来自 Visual Studio 2008 SP1 TeamSuite:

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

            【讨论】:

            • 它如何帮助自动化任务?
            【解决方案13】:

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

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

            代码也可以在 github 上找到。

            【讨论】:

              【解决方案14】:

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

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

              【讨论】:

                猜你喜欢
                • 2014-02-18
                • 2012-03-14
                • 1970-01-01
                • 1970-01-01
                • 2014-01-21
                • 2016-12-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多