目前有一个数据库是在sql server2008里,想把这个库导入2005中(或是2000中),在2008中生成.bak备份文件后,不能导入2005或2000中。想问一下,有没有这个功能,就是:
1 先把数据库的表生成一个sql文件,里面包含表结构和表关系,还有存储过程,就是一些 Create table,procedure语句。
2 再生成一个数据文件,向表里插入数据,里面是Insert语句。如果这样,两个文件里都是标准sql语句(存储过程不算,呵呵),以后导入任何一个版本的数据库都可以了。诚问如何操作,或是执行什么命令?感谢!

解决方案 »

  1.   

    生成脚本文件
    2008转到2000的步骤 
    1. 生成for 2000版本的数据库脚本 
    2008 的manger studio 
    -- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例 
    -- 右键要转到2000的库 
    -- 任务 
    -- 生成脚本 
    -- 在"脚本向导"的"选择数据库"中, 确定选择的是要转到2000的库 
    -- 勾选"为所选数据库中的所有对象编写脚本" 
    -- 在接下来的"选择脚本选项"中, 将”编写创建数据库的脚本”设为True,找到"为服务器版本编写脚本"项, 选择"SQL Server 2000" 
    -- 其他选项根据需要设置 
    -- 最后把脚本保存到一个 .sql 脚本文件 2. 在2000中创建目标数据库 
    在查询分析器(或2008的manger studio在打开脚本文件), 连接到SQL Server 2000,执行上面生成的脚本.以创建一个新的数据库 3. 将数据从2008导到2005 
    打开SQL Server 2005的企业管理器 
    -- 右键要导入数据的数据库 
    -- 任务 
    -- 导入数据 
    -- 在"SQL Server 导入和导出向导"的"选择数据源"步骤中, 确定选择的是要导出的数据库 
    -- 在"选择数据源"步骤中, 连接到 2005, 并选择源数据库 
    -- 在"选择源表和源视图"中, 选择所有的表 
    -- 最后完成 
      

  2.   

    参考一下这个:
    2008转到2000的步骤
    1. 生成for 2000版本的数据库脚本
    2008 的manger studio
    -- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例
    -- 右键要转到2000的库
    -- 任务
    -- 生成脚本
    -- 在"脚本向导"的"选择数据库"中, 确定选择的是要转到2000的库
    -- 勾选"为所选数据库中的所有对象编写脚本"
    -- 在接下来的"选择脚本选项"中, 将”编写创建数据库的脚本”设为True,找到"为服务器版本编写脚本"项, 选择"SQL Server 2000"
    -- 其他选项根据需要设置
    -- 最后把脚本保存到一个 .sql 脚本文件2. 在2000中创建目标数据库
    连接到SQL Server 2000,执行上面生成的脚本.以创建一个新的数据库3. 将数据从2008导到2000
    打开SQL Server 2000的企业管理器
    -- 右键要导入数据的数据库
    -- 任务
    -- 导入数据
    -- 在"SQL Server 导入和导出向导"的"选择数据源"步骤中, 确定选择的是要导出的数据库
    -- 在"选择数据源"步骤中, 连接到 2008, 并选择源数据库
    -- 在"选择源表和源视图"中, 选择所有的表
    -- 最后完成
      

  3.   

    http://blog.163.com/ouyang789987/blog/static/25240590200895113527590/
      

  4.   

    参考一sql2005备份在sql2000中恢复 
    sql2005中的备份要在sql2000中还原,首先在sql2005中还原,然后选择兼容sql2000(80),备份后再在sql2000种还原。用mdf和ldf来备份数据库,首先要分离数据库,右键备份数据库-任务-分离,对数据库分离,数据库的readonly要为false。分离后,在sql的data目录下找到要备份的mdf和ldf数据库。还原时选择附加数据库,选择对应的mdf和ldf文件,附加即可。要判断要附加的数据库是否为只读,如果是,要去掉只读属性。要附加的数据库文件即mdf和ldf文件的安全设置中设置user用户完全控制权限,即为数据库文件的属性,设置成功后才可以附加。否则会抱错,要附加的数据库为只读。要导出数据库脚本时,右键导出的数据库-任务-生成脚本以下是sql语句备份还原数据库: /*--备份数据库   
            
      /*--调用示例   
        
      --备份当前数据库   
      exec   p_backupdb   @bkpath='c:\',@bkfname='db_\DATE\_db.bak'   
        
      --差异备份当前数据库   
      exec   p_backupdb   @bkpath='c:\',@bkfname='db_\DATE\_df.bak',@bktype='DF'   
        
      --备份当前数据库日志   
      exec   p_backupdb   @bkpath='c:\',@bkfname='db_\DATE\_log.bak',@bktype='LOG'   
        
      --*/   
        
      if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_backupdb]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)   
      drop   procedure   [dbo].[p_backupdb]   
      GO   
        
      create   proc   p_backupdb   
      @dbname   sysname='', --要备份的数据库名称,不指定则备份当前数据库   
      @bkpath   nvarchar(260)='', --备份文件的存放目录,不指定则使用SQL默认的备份目录   
      @bkfname   nvarchar(260)='', --备份文件名,文件名中可以用\DBNAME\代表数据库名,\DATE\代表日期,\TIME\代表时间   
      @bktype   nvarchar(10)='DB', --备份类型:'DB'备份数据库,'DF'   差异备份,'LOG'   日志备份   
      @appendfile   bit=1 --追加/覆盖备份文件   
      as   
      declare   @sql   varchar(8000)   
      if   isnull(@dbname,'')=''   set   @dbname=db_name()   
      if   isnull(@bkpath,'')=''   set   @bkpath=dbo.f_getdbpath(null)   
      if   isnull(@bkfname,'')=''   set   @bkfname='\DBNAME\_\DATE\_\TIME\.BAK'   
      set   @bkfname=replace(replace(replace(@bkfname,'\DBNAME\',@dbname)   
      ,'\DATE\',convert(varchar,getdate(),112))   
      ,'\TIME\',replace(convert(varchar,getdate(),108),':',''))   
      set   @sql='backup   '+case   @bktype   when   'LOG'   then   'log   '   else   'database   '   end   +@dbname   
      +'   to   disk='''+@bkpath+@bkfname   
      +'''   with   '+case   @bktype   when   'DF'   then   'DIFFERENTIAL,'   else   ''   end   
      +case   @appendfile   when   1   then   'NOINIT'   else   'INIT'   end   
      print   @sql   
      exec(@sql)   
      go   
        
      ----------------------------------------------------------------------   
      /*--恢复数据库   
        
      --邹建   2003.10--*/   
        
      /*--调用示例   
      --完整恢复数据库   
      exec   p_RestoreDb   @bkfile='c:\db_20031015_db.bak',@dbname='db'   
        
      --差异备份恢复   
      exec   p_RestoreDb   @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'   
      exec   p_backupdb   @bkfile='c:\db_20031015_df.bak',@dbname='db',@retype='DF'   
        
      --日志备份恢复   
      exec   p_RestoreDb   @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'   
      exec   p_backupdb   @bkfile='c:\db_20031015_log.bak',@dbname='db',@retype='LOG'   
        
      --*/   
        
      if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_RestoreDb]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)   
      drop   procedure   [dbo].[p_RestoreDb]   
      GO   
        
      create   proc   p_RestoreDb   
      @bkfile   nvarchar(1000), --定义要恢复的备份文件名   
      @dbname   sysname='',         --定义恢复后的数据库名,默认为备份的文件名   
      @dbpath   nvarchar(260)='', --恢复后的数据库存放目录,不指定则为SQL的默认数据目录   
      @retype   nvarchar(10)='DB', --恢复类型:'DB'完事恢复数据库,'DBNOR'   为差异恢复,日志恢复进行完整恢复,'DF'   差异备份的恢复,'LOG'   日志恢复   
      @filenumber   int=1, --恢复的文件号   
      @overexist   bit=1,             --是否覆盖已经存在的数据库,仅@retype为   
      @killuser   bit=1       --是否关闭用户使用进程,仅@overexist=1时有效   
      as   
      declare   @sql   varchar(8000)   
        
      --得到恢复后的数据库名   
      if   isnull(@dbname,'')=''   
      select   @sql=reverse(@bkfile)   
      ,@sql=case   when   charindex('.',@sql)=0   then   @sql   
      else   substring(@sql,charindex('.',@sql)+1,1000)   end   
      ,@sql=case   when   charindex('\',@sql)=0   then   @sql   
      else   left(@sql,charindex('\',@sql)-1)   end   
      ,@dbname=reverse(@sql)   
        
      --得到恢复后的数据库存放目录   
      if   isnull(@dbpath,'')=''   set   @dbpath=dbo.f_getdbpath('')   
        
      --生成数据库恢复语句   
      set   @sql='restore   '+case   @retype   when   'LOG'   then   'log   '   else   'database   '   end+@dbname   
      +'   from   disk='''+@bkfile+''''   
      +'   with   file='+cast(@filenumber   as   varchar)   
      +case   when   @overexist=1   and   @retype   in('DB','DBNOR')   then   ',replace'   else   ''   end   
      +case   @retype   when   'DBNOR'   then   ',NORECOVERY'   else   ',RECOVERY'   end   
      print   @sql   
      --添加移动逻辑文件的处理   
      if   @retype='DB'   or   @retype='DBNOR'   
      begin   
      --从备份文件中获取逻辑文件名   
      declare   @lfn   nvarchar(128),@tp   char(1),@i   int   
        
      --创建临时表,保存获取的信息   
      create   table   #tb(ln   nvarchar(128),pn   nvarchar(260),tp   char(1),fgn   nvarchar(128),sz   numeric(20,0),Msz   numeric(20,0))   
      --从备份文件中获取信息   
      insert   into   #tb   exec('restore   filelistonly   from   disk='''+@bkfile+'''')   
      declare   #f   cursor   for   select   ln,tp   from   #tb   
      open   #f   
      fetch   next   from   #f   into   @lfn,@tp   
      set   @i=0   
      while   @@fetch_status=0   
      begin   
      select   @sql=@sql+',move   '''+@lfn+'''   to   '''+@dbpath+@dbname+cast(@i   as   varchar)   
      +case   @tp   when   'D'   then   '.mdf'''   else   '.ldf'''   end   
      ,@i=@i+1   
      fetch   next   from   #f   into   @lfn,@tp   
      end   
      close   #f   
      deallocate   #f   
      end   
        
      --关闭用户进程处理   
      if   @overexist=1   and   @killuser=1   
      begin   
      declare   @spid   varchar(20)   
      declare   #spid   cursor   for   
      select   spid=cast(spid   as   varchar(20))   from   master..sysprocesses   where   dbid=db_id(@dbname)   
      open   #spid   
      fetch   next   from   #spid   into   @spid   
      while   @@fetch_status=0   
      begin       
      exec('kill   '+@spid)   
      fetch   next   from   #spid   into   @spid   
      end       
      close   #spid   
      deallocate   #spid   
      end   
        
      --恢复数据库   
      exec(@sql)   
        
      go   
    0 0 0 
    (请您对文章做出评价)