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


97

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

现在我要做的是:

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

有没有办法自动执行此任务?

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


找到答案了吗?我也想这样做,我使用了发布,它很难保存,不知道生成脚本时在哪里和那里没有所有选项:-?
Alexa Adrian

1
如若干答案中所述,如果您是开发人员,请使用SMO
Jay Jay Jay

Answers:


31

Brann从Visual Studio 2008 SP1团队套件中提到的是数据库发布向导的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/

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


2012年是否有同等水平?如果向导记得我的设置(例如“脚本索引”),我会很高兴。
PeterX 2014年

6
@PeterX SMSS>工具>选项> SQL Server对象资源管理器>脚本
编制


@zanlok非常有用的评论。不幸的是他们缺少了2014年“包括不支持的语句”在SQL Server中的选项
jk7

42

与SSMS中的脚本生成相比,SqlPubwiz的选项非常有限。相比之下,SMO可用的选项几乎与SSMS中的选项完全匹配,这表明它甚至可能是相同的代码。(我希望MS没写两次!)有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();

9
您可以Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizard从程序集C:\ Program Files(x86)\ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ Microsoft.SqlServer.Management.SqlScriptPublishUI.dll中查看该类。这就是SSMS所使用的。(或者,您可以看课Microsoft.SqlServer.Management.UI.GenerateScript从程序集C:\ Program Files(x86)\ Microsoft SQL Server \ 110 \ Tools \ Binn \ ManagementStudio \ ReplicationDialog.dll中
该类

这里的示例代码和链接是一个很好的开始,应该是对OP的最完整的回答(这也是我的确切问题)。
zanlok

1
我一起破解了一个C#应用程序,该程序可让您从Linux中的命令行生成SQL Server脚本。您只需要.Net Core 2预览版:github.com/mkurz/SQLServerScripter
mkurz

20

我编写了一个名为SchemaZen的开源命令行实用程序来完成此任务。它比Management Studio中的脚本要快得多,并且输出的版本控制更加友好。它支持脚本的架构和数据。

要生成脚本,请运行:

schemazen.exe脚本--server localhost-数据库db --scriptDir c:\ somedir

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

schemazen.exe创建--server本地主机-数据库db --scriptDir c:\ somedir

我刚刚尝试过SchemaZen,我印象深刻。第一次工作。谢谢塞思!
Simon Hughes 2015年

@Seth那么您使用什么来编写对象脚本?我没有看到任何对Microsoft.SqlServer的任何引用(嗯,有一个未使用的using语句)。
约翰

@John-模式Zen包含它自己的脚本库。它将模式读入模型,然后基于该模型生成脚本。有关简单的示例,请参见github.com/sethreno/schemazen/blob/master/model/Models/…
塞斯·里诺



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

4

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


3
那不是我真正需要的。我想获取创建脚本(我的最终目标是将这些文件自动签入我的源代码控制系统中)
布兰(Brann

3

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

也有第三方工具-我喜欢Apex SQL Script,可以精确地用于您所谈论的用途。我完全从命令行运行它。


3

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

像魅力一样为我工作。它是Microsoft提供的基于python的新工具,可从命令行运行。一切工作都像Microsoft页面上所述(请参见下面的链接)所述,适用于我与SQL 2012 Server。

您通过pip安装它:

$ pip安装mssql-scripter

像往常一样使用h获取帮助的命令参数概述:

mssql脚本-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-观看次数/


2

如果要使用Microsoft解决方案,请尝试:Microsoft SQL Server数据库发布向导1.1

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

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


1
不幸的是,它不支持SqlServer 2008
Brann,

1
1.2版说它支持2000和2005,但是我只是用它在2008年用3800多个表编写了数据库脚本,并且运行良好。它不包括compress选项,直到2008年才推出。我还刚刚针对2008 R2数据库进行了测试,它的脚本也很好。
杰里米

2

我一直在使用数据库比较器-它是免费的,没有麻烦的整个数据库脚本,可以与另一个数据库进行比较,还可以生成Diff脚本。非常适合开发到生产变更脚本。 http://www.dbcomparer.com/



0

从Visual Studio 2008 SP1 TeamSuite中:

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


它如何帮助自动化任务?
Serge Wautier 2010年

0

我正在使用VS 2012(用于MSSQL Server 2008上的数据库)比较数据库具有保存它的选项,比较和选项。从本质上讲,这是您要设置的设置。之后,您可以进行更新或生成脚本。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.