我希望能够在SQL Server Management Studio 2008中自动化脚本生成。
目前我的做法是:
- 右键单击我的数据库,选择Tasks,"Generate Scripts..."
- 手动选择我需要的所有导出选项,在"select object"选项卡上选择"select all"
- 选择导出文件夹
- 最后点击"Finish"按钮
是否有一种方法可以自动化此任务?
编辑:我想生成创建脚本,而不是更改脚本。
我希望能够在SQL Server Management Studio 2008中自动化脚本生成。
目前我的做法是:
是否有一种方法可以自动化此任务?
编辑:我想生成创建脚本,而不是更改脚本。
与 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();
Microsoft.SqlServer.Management.SqlScriptPublish.ScriptPublishWizard
。这是SSMS使用的。(或者,你也可以查看程序集C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\ReplicationDialog.dll中的类Microsoft.SqlServer.Management.UI.GenerateScript
。) - cubetwo1729Brann所提到的来自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。
编辑:我已经开始使用RedGate的SQL Compare产品来完成这项工作。它是应该具备的所有sql发布向导的非常好的替代品。您可以选择数据库、备份或快照作为源,将一个文件夹作为输出位置,然后将所有内容漂亮地倾泻到一个文件夹结构中。这恰好是他们的另一款产品SQL Source Control所使用的格式。
我编写了一个名为SchemaZen的开源命令行实用程序,可以快速生成SQL Server对象脚本。它比从管理工具中进行脚本更快,并且其输出更适合版本控制。它支持对架构和数据进行脚本生成。
要生成脚本,请运行:
schemazen.exe script --server localhost --database db --scriptDir c:\somedir
然后,要从脚本重新创建数据库,请运行:
schemazen.exe create --server localhost --database db --scriptDir c:\somedir
我在这些答案中没有看到提到使用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的配置性/可定制性与使用像数据库发布向导这样的简单现有工具的便利性和可维护性相结合。
你可以使用 INFORMATION_SCHEMA 表以 T-SQL 代码的形式进行操作。
还有第三方工具 - 我喜欢 Apex SQL Script,它非常适合你所说的用途。我完全从命令行运行它。