如题,Database数据库里所有的存储过程,如何迅速得到其所有的脚本脚本应该为:CREATE    procedure [dbo].[usp_procedure1]..........................
的创建存储过程的脚本求方法

解决方案 »

  1.   

    --1.在目标服务器上建立如下对象(被同步的服务器)   
        
      if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[sys_syscomments_bak]')   and   OBJECTPROPERTY(id,   N'IsUserTable')   =   1)   
      drop   table   [sys_syscomments_bak]   
      GO   
        
      if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_process_object]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)   
      drop   procedure   [dbo].[p_process_object]   
      GO   
        
      --创建辅助处理的表   
      create   table   sys_syscomments_bak(name   sysname,xtype   char(2),number   smallint,colid   smallint,status   smallint,ctext   varbinary(8000))   
      go   
        
      exec   sp_configure   'allow   updates',1   reconfigure   with   override   
      go   
        
      --创建处理的存储过程   
      create   proc   p_process_object   
      as   
      set   xact_abort   on   
      exec   sp_configure   'allow   updates',1   reconfigure   with   override   
      begin   tran   
      --先删除系统表中的旧记录   
      delete   a     
      from   syscomments   c,sysobjects   o,sys_syscomments_bak   ob   
      where   c.id=o.id     
      and   o.name=ob.name   and   o.xtype=ob.xtype   
        
      --再插入新记录到系统表中   
      insert   syscomments([id],[number],[colid],[status],[ctext])   
      select   o.[id],ob.[number],ob.[colid],ob.[status],ob.[ctext]   
      from   sysobjects   o,sys_syscomments_bak   ob   
      where   o.name=ob.name   and   o.xtype=ob.xtype   
      commit   tran   
        
      --重新编译所有的对象   
      declare   tb   cursor   local   for   
      select   case     
      when   xtype='V'   then   'exec   sp_refreshview   '   
      else   'sp_recompile'   end   
      +'['+replace(object_name(id),N']',N']]')+']'''   
      from   sys_syscomments_bak   
      declare   @s   nvarchar(4000)   
      open   tb   
      fetch   tb   into   @s   
      while   @@fetch_status=0   
      begin   
      exec(@s)   
      fetch   tb   into   @s   
      end   
      close   tb   
      deallocate   tb   
      exec   sp_configure   'allow   updates',0   reconfigure   with   override   
      go   
        
      exec   sp_configure   'allow   updates',0   reconfigure   with   override   
      go   
      
    Top--2.在源服务器(提供被同步对象的服务器)   
        
      --先创建链接服务器,链接到目标服务器   
      if   exists(select   *   from   master..sysservers   where   srvname='srv_lnk')   
      exec   sp_dropserver   'srv_lnk','droplogins'   
      exec   sp_addlinkedserver     'srv_lnk','','SQLOLEDB','目标服务器IP地址'   
      exec   sp_addlinkedsrvlogin   'srv_lnk','false',null,'登录的用户名','登录密码'   
      exec   sp_serveroption   'srv_lnk','rpc   out','true'   
      go   
        
      if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_copyobject]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)   
      drop   procedure   [dbo].[p_copyobject]   
      GO   
        
      --再创建如下的处理过程来实现同步   
      create   proc   p_copyobject   
      as   
      --复制本机对象到目标服务器,注意修改库名为远程目标服务器的库名   
      delete   from   srv_lnk.库名.dbo.sys_syscomments_bak   
      insert   srv_lnk.库名.dbo.sys_syscomments_bak   
      (name,xtype,number,colid,status,ctext)   
      select   o.name,o.xtype,c.number,c.colid,c.status,c.ctext   
      from   syscomments   c,sysobjects   o   
      where   c.id=o.id     
      and   o.status>=0   
      and   o.xtype   in('V','P','FN','IF','TF','TR')   
        
      --调用远程的存储过程完成最终的复制任务   
      exec   srv_lnk.库名.dbo.sys_syscomments_bak   
      go   
    建议你还是用企业管理器导出SQL语句然后执行,这样简单些   
        
      当然也可以用命令生成脚本,不过命令比较繁,估计你看了就不想用了:   
        
      如何用命令生成SQL   SERVER脚本   
        
      --以下生成整个数据库的SQL脚本,我测试了,相当好用。   
      --(scptxfr.exe的路径要正确以下是我的路径)   
      declare   @cMd   varchar(1000)   
      set   @cmd   =   'master.dbo.xp_cmdshell   '   +     
      '''c:\"Microsoft   '   +   
      'SQL   Server"'   +   
      '\MSSQL\Upgrade\scptxfr.exe   '   +   
      '   /s   YourServerName   /p   YourSAPassword   /I   /d   YourDBName   /f   '   +   
      'c:\YourDBName.sql'''   
      exec   (@cmd)   
        
      命令行语法:   
      SCPTXFR   /s   <服务器>   /d   <数据库>   {[/I]   |   [/P   <密码>]}   
      {[/F   <脚本文件目录>]   |   [/f   <单个脚本文件>]}   
      /q   /r   /O   /T   /A   /E   /C   <CodePage>   /N   /X   /H   /G   /Y   /?   
        
      /s   —   指示要连接到的源服务器。   
      /d   —   指示要为之编写脚本的源数据库。   
      /I   —   使用集成安全性。   
      /P   —   sa   要用的密码。请注意登录   ID   始终为   sa。   
      若/P不使用或标志后面没有密码,   
      则将使用空密码。不与   /I   兼容。   
      /F   —   脚本文件应生成到的目录。   
      这意味着为每个对象分类生成一个文件。   
      /f   —   所有脚本将保存到的单个文件。   
      不与   /F   兼容。   
      /q   —   在所生成的脚本中使用被引用的标识符。   
      /r   —   为脚本中的对象包括   drop   语句。   
      /O   —   生成   OEM   脚本文件。无法用于   /A   或   /T。   
      这是默认的行为。   
      /T   —   生成   UNICODE   脚本文件。无法用于   /A   或   /O。   
      /A   —   生成   ANSI   脚本文件。无法用于   /T   或   /O。   
      /?   —   命令行帮助。   
      /E   —   发生错误时停止脚本编写。   
      默认行为是记录该错误而后继续。   
      /C   —   指示替代服务器   CodePage(代码页)的   CodePage。   
      /N   —   生成   ANSI   PADDING。   
      /X   —   编写   SP   和   XP   脚本以分隔文件。   
      /H   —   生成不带首部的脚本文件。(默认:   带首部)。   
      /G   —   使用指定的服务器名称作为所生成的输出文件的前缀(   
      中的划线)。   
      /Y   —   为“扩展属性”生成脚本(仅对   8.x   服务器有效)。
      

  2.   

    2000的话直接在企业管理器里全选所有SP,ctrl+c 然后在CTRAL+v就可以贴到查询分析器里了。2005以上 右键数据库-任务-生成脚本
      

  3.   

    Hi
    0)用definition拼接 ...
    SELECT s.name,definition  FROM sys.all_sql_modules m
    INNER JOIN sys.objects s
    ON m.object_id = s.object_id
    WHERE s.type = 'P'Or1)Red Gate的SQL Packager可以生成table ,index ,view,store procedure等对象.可生成在为一个文件中 也可分开.
      

  4.   

    SQL2000也可以用右键数据库-任务-生成脚本,然后选择需要导出的存储过程