生成与Transact SQL等效的脚本

时间:2010-12-17 23:27:53

标签: sql tsql

在SQL Server Management Studio中,有一个“生成脚本”选项。我们当前将2008 sql server数据库传输到2005 sql server数据库的方式是生成脚本并在该sql脚本文件上运行SQLCMD以推送到2005 sql server的本地实例。我正在创建一个C#程序来完成一大堆其他任务,但我还需要它来转换2008数据库并将其移动到2005 sql server。是否有Transact sql语句或更简单的方法将2008数据库转换为2005数据库?感谢。

3 个答案:

答案 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.使用“现代”系统来支持遗留系统是最好是丑陋。

只是因为我再次这样做,我首选的迁移路径是:

  • 在2005年进行开发,“升级”和生产环境
  • 升级到2008年
  • 继续在dev / 2005上进行开发,并将更改推送到暂存(2008)和生产(2005)。当它在2008年运行时(几乎可以肯定),mgmt将满足于升级生产。您的2005版本仍然可以在2005年生产。
  • 升级生产。嘿,它起作用,所以它是安全和理智的
  • 从(2005)开发中生成的所有内容都适用于(2008)登台和制作
  • 只有这样你才能升级开发并玩新玩具