在SQL Server Management Studio中,有一个“生成脚本”选项。我们当前将2008 sql server数据库传输到2005 sql server数据库的方式是生成脚本并在该sql脚本文件上运行SQLCMD以推送到2005 sql server的本地实例。我正在创建一个C#程序来完成一大堆其他任务,但我还需要它来转换2008数据库并将其移动到2005 sql server。是否有Transact sql语句或更简单的方法将2008数据库转换为2005数据库?感谢。
答案 0 :(得分:4)
您的开发可交付成果不应该是数据库二进制文件(.MDF文件),而是部署脚本。您可以像对待任何其他源文件一样处理数据库部署和升级,将其置于源代码管理之下,在签入时进行对等代码审查等。直接修改.MDF然后进行逆向工程以部署它只是非常糟糕。您现在遇到的问题只是其中一个问题,还有更多问题,特别是在应用程序版本升级期间完成的架构更改问题。见Version Control and your Database。
现在确实整个VS工具集都试图引导你“在VS数据库资源管理器中编辑你的MDF并且一切都会好”的路径。什么都不会好,一个或多个部署崩溃在你的生活中领先,但让我们假装VS做了一件好事。
您可以通过第三方商业工具(如Red Gate的SQL Compare)自动提取当前架构并部署它,或者您可以相当轻松地滚动自己的'Generate Scripts'。它所做的所有SSMS调用SMO脚本功能来编写整个数据库的脚本。您也可以这样做:实例化一个Scripter
对象实例,然后将要编写脚本的对象添加到其中,然后提取T-SQL生成的脚本。那就是完全 SSMS中的'Generate Scripts'。 MSDN中有scripting的例子:
//Connect to the local, default instance of SQL Server.
Server srv = new Server();
//Reference the AdventureWorks2008R2 database.
Database db = srv.Databases["AdventureWorks2008R2"];
//Define a Scripter object and set the required scripting options.
Scripter scrp = new Scripter(srv);
scrp.Options.ScriptDrops = false;
scrp.Options.WithDependencies = true;
//Iterate through the tables in database and script each one. Display the script.
//Note that the StringCollection type needs the System.Collections.Specialized namespace to be included.
Microsoft.SqlServer.Management.Sdk.Sfc.Urn[] smoObjects = new Microsoft.SqlServer.Management.Sdk.Sfc.Urn[1] ;
foreach (Table tb in db.Tables) {
smoObjects[0] = tb.Urn;
if (tb.IsSystemObject == false) {
System.Collections.Specialized.StringCollection sc;
sc = scrp.Script(smoObjects);
foreach ( string st in sc) {
Console.WriteLine(st);
}
}
}
答案 1 :(得分:0)
从另一个数据库导入
答案 2 :(得分:0)
将数据库对象编写出来,然后在旧实例上运行它们是可行的方法。如果您编写了特定于SQL 2008的功能,那么在2005年运行脚本时就可以找到它(所以在您尝试生产之前进行测试!)。
在此处设置兼容模式将不帮助。如果我有一个(2008)声明的表类型并且我将它与存储过程参数一起使用,那么 nothing SQL或其他任何人都可以将它迁移到2005.使用“现代”系统来支持遗留系统是最好是丑陋。
只是因为我再次这样做,我首选的迁移路径是: