我想在SQL Server Management Studio 2008中自动生成脚本。
现在我要做的是:
- 右键单击我的数据库,“任务”,“生成脚本...”。
- 手动选择我需要的所有导出选项,然后在“选择对象”选项卡上单击全选
- 选择导出文件夹
- 最终点击“完成”按钮
有没有办法自动执行此任务?
编辑:我想生成创建脚本,而不是更改脚本。
我想在SQL Server Management Studio 2008中自动生成脚本。
现在我要做的是:
有没有办法自动执行此任务?
编辑:我想生成创建脚本,而不是更改脚本。
Answers:
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一起使用。
编辑:从那以后我就开始使用RedGate的SQL比较产品来做到这一点。这是sql发布向导应有的一切的很好替代。您选择一个数据库,备份或快照作为源,并选择一个文件夹作为输出位置,它将所有内容很好地转储到文件夹结构中。它恰好与他们的其他产品SQL Source Control使用的格式相同。
与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();
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中
我编写了一个名为SchemaZen的开源命令行实用程序来完成此任务。它比Management Studio中的脚本要快得多,并且输出的版本控制更加友好。它支持脚本的架构和数据。
要生成脚本,请运行:
schemazen.exe脚本--server localhost-数据库db --scriptDir c:\ somedir
然后要从脚本重新创建数据库,请运行:
schemazen.exe创建--server本地主机-数据库db --scriptDir c:\ somedir
您可以使用SQL Server管理对象(SMO)来自动化SQL Server 2005管理任务,包括生成脚本: http://msdn.microsoft.com/zh-cn/library/ms162169.aspx。
如果您是开发人员,则一定要使用SMO。这是Scripter类的链接,这是您的起点:
在这些答案中,我都没有看到带有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,可以精确地用于您所谈论的用途。我完全从命令行运行它。
尝试使用新的SQL Server命令行工具来生成T-SQL脚本并监视动态管理视图。
像魅力一样为我工作。它是Microsoft提供的基于python的新工具,可从命令行运行。一切工作都像Microsoft页面上所述(请参见下面的链接)所述,适用于我与SQL 2012 Server。
您通过pip安装它:
$ pip安装mssql-scripter
像往常一样使用h获取帮助的命令参数概述:
mssql脚本-h
提示:如果您通过Windows身份验证登录到SQL Server,则只需保留用户名和密码即可。
我一直在使用数据库比较器-它是免费的,没有麻烦的整个数据库脚本,可以与另一个数据库进行比较,还可以生成Diff脚本。非常适合开发到生产变更脚本。 http://www.dbcomparer.com/
我还为我的需求构建了这个简单的命令行工具。
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/
它可以导出整个数据库,并尝试导出加密的对象。一切都存储在文件夹和单独的sql文件中,以便于文件比较。
代码也可以在github上找到。
从Visual Studio 2008 SP1 TeamSuite中:
在“服务器资源管理器/数据连接”选项卡中,有一个“发布到提供程序”工具,其功能与“ Microsoft SQL Server数据库发布向导”相同,但与MS Sql Server 2008兼容。