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

时间:2009-01-27 14:24:14

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

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

现在我所做的是:

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

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

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

14 个答案:

答案 0 :(得分:38)

与SSMS中的脚本生成相比,SqlPubwiz的选项非常有限。相比之下,SMO可用的选项几乎与SSMS中的选项完全匹配,这表明它甚至可能是相同的代码。 (我希望MS不会写两次!)MSDN上有几个例子,如this one,它们将脚本表显示为单个对象。但是,如果您希望所有内容都使用包含“DRI”(声明参照完整性)对象(如外键)的“完整”架构正确编写脚本,则单独编写脚本表将无法正确地处理依赖项。我发现收集所有URN并将它们作为数组交给脚本编写器是必要的。从这个例子中修改过的代码对我有用(虽然我敢说你可以整理一下并对它进行更多评论):

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

答案 1 :(得分:31)

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相同的麻烦(用户转换为角色,约束不是以正确的顺序创建的),但它不是我的解决方案,因为它没有'将脚本对象转换为不同的文件,例如SSMS中的Tasks-&gt; 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使用的格式相同。

答案 2 :(得分:13)

我编写了一个名为SchemaZen的开源命令行实用程序来执行此操作。它比管理工作室的脚本快得多,它的输出更适合版本控制。它支持脚本化架构和数据。

生成脚本运行:

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

然后从脚本运行:

重新创建数据库
schemazen.exe create --server localhost --database db --scriptDir c:\somedir

答案 3 :(得分:12)

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

答案 4 :(得分:7)

如果您是开发人员,请务必使用SMO。这是Scripter类的链接,这是您的出发点:

Scripter Class

答案 5 :(得分:7)

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

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的可配置性/可定制性,以及使用简单的现有工具(如数据库发布向导)的便利性和可维护性。

答案 6 :(得分:4)

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

答案 7 :(得分:3)

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

还有第三方工具 - 我喜欢Apex SQL Script,正是您所讨论的用途。我从命令行完全运行它。

答案 8 :(得分:2)

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

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

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

答案 9 :(得分:2)

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

答案 10 :(得分:1)

我还根据自己的需要制作了这个简单的命令行工具 http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

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

代码也可以在github上找到。

答案 11 :(得分:1)

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

像魅力一样为我工作。它是Microsoft提供的基于python的新工具,可从命令行运行。 一切都按照Microsoft页面上的说明进行操作(请参见下面的链接) 为我使用了SQL 2012 Server。

您通过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/

答案 12 :(得分:0)

从Visual Studio 2008 SP1 TeamSuite:

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

答案 13 :(得分:0)

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

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