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

Bra*_*ann 92 sql-server automation ssms sql-server-2008 visual-studio-2008

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

现在我做的是:

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

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

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

Old*_*eve 40

与SSMS中的脚本生成相比,SqlPubwiz的选项非常有限.相比之下,SMO提供的选项几乎与SSMS中的选项完全匹配,这表明它甚至可能是相同的代码.(我希望MS没写两次!)有MSDN上几个例子像这一次,显示脚本表作为单独的对象.但是,如果您希望所有内容都使用包含"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();
Run Code Online (Sandbox Code Playgroud)

  • 你可以从程序集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`.) (9认同)
  • 我开发了一个 C# 应用程序,它允许您从 Linux 中的命令行生成 SQL 服务器脚本。您只需要 .Net Core 2 预览版:https://github.com/mkurz/SQLServerScripter (2认同)

noo*_*ish 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
Run Code Online (Sandbox Code Playgroud)

我不知道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使用的格式相同.

  • @PeterX SMSS>工具>选项> SQL Server对象资源管理器>脚本 (6认同)

Set*_*eno 15

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

要生成脚本运行:

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

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

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


Joe*_*Joe 12

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


Rya*_*ndy 7

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

Scripter类


Tao*_*Tao 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
Run Code Online (Sandbox Code Playgroud)

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

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

这种方法的主要优点是它结合了直接使用SMO的可配置性/可定制性,以及使用简单的现有工具(如数据库发布向导)的便利性和可维护性.


Joh*_*han 5

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

  • 这不正是我所需要的。我想获取创建脚本(我的最终目标是自动将这些文件签入我的源代码控制系统) (5认同)