CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

急求复制表结构的通用存储过程!!!!

楼主zlt982001(乐天)2005-07-21 16:53:15 在 MS-SQL Server / 基础类 提问

如题:  
  要求复制表到其他库中  
  能够包含原表完整的结构,如索引,约束,默认值,描述等等  
   
  因为要得比较急,没有时间仔细想,  
  如果其他兄弟有现成得可用得,请贴上,再送100   分 问题点数:100、回复次数:14Top

1 楼zlt982001(乐天)回复于 2005-07-21 16:55:00 得分 0

在线等待,解决马上结贴Top

2 楼guangli_zhang(广丽)回复于 2005-07-21 17:02:31 得分 0

直接用COPY  
  然后在其它库中执行  
  应该可以Top

3 楼vivianfdlpw()回复于 2005-07-21 17:03:34 得分 0

看看这个:  
  批量表结构提取和批量建表  
  http://dev.csdn.net/article/72/72614.shtmTop

4 楼zjcxc(邹建)回复于 2005-07-21 17:08:18 得分 100

if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[P_CopyDB]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)  
  drop   procedure   [dbo].[P_CopyDB]  
  GO  
   
  /*--   在   SQLServer   中使用SQLDMO.Transfer   实现数据迁移  
   
  Transfer对象的重要属性:  
  属性名                                                         类型                                 描述  
  ---------------------------------   -------------------   --------------------  
  CopyAllDefaults                                       Boolean                           所有默认值  
  CopyAllObjects                                         Boolean                           所有对象  
  CopyAllRules                                             Boolean                           所有规则  
  CopyAllStoredProcedures                       Boolean                           所有存储过程  
  CopyAllTables                                           Boolean                           所有表  
  CopyAllTriggers                                       Boolean                           所有触发器  
  CopyAllUserDefinedDatatypes               Boolean                           所有用户自定义类型  
  CopyAllViews                                             Boolean                           所有视图  
  CopyData                                                     Boolean                           所有数据  
  DestDatabase                                             String                             目标对象数据库  
  DestLogin                                                   String                             目标数据库登陆用户名  
  DestPassword                                             String                             目标数据库登陆密码  
  DestServer                                                 String                             目标服务器  
  DestUseTrustedConnection                     Boolean                           用户信任连接  
  DropDestObjectsFirst                             Boolean                           是否先删除目标对象  
  IncludeDependencies                               Boolean                           是否包含依靠对象  
  ScriptType                                                 Boolean                           脚本类型  
   
  重要方法:    
  方法名称                                         功能描述  
  ---------------------------   --------------------------  
  AddObject                                       增加对象  
  AddObjectByName                           通过对象名称增加对象  
   
  存储过程实现源数据库到目标数据库的对象和数据的复制  
  要求源数据库和目标数据库在同一服务器  
  如果是要实现不同服务器之间的复制,则需要增加验证信息  
  --邹建   2005.07(引用请保留此信息)--*/  
   
  /*--调用示例  
   
  CREATE   DATABASE   test  
  EXEC   P_CopyDB   @Source_DB='northwind',@Des_DB='test'  
  DROP   DATABASE   test  
  --*/  
  --对象复制  
  CREATE   PROCEDURE   P_CopyDB            
  @Des_DB             sysname,                       --目标数据库  
  @Obj_Type         nvarchar(4000)=N'',--复制的对象类型,可以是下列字符串列表:  
                                                                  --   O   所有对象,D   默认值,R   规则,P   存储过程  
                                                                  --   T   表,TR   触发器,DT   用户定义数据类型  
                                                                  --   V   视图,DATA   数据,DEL   删除目标对象  
  @Source_DB       sysname=N'',               --源数据库  
  @ServerName     sysname=N'',               --服务器名  
  @UserName         sysname=N'',               --用户名,不指定则表示使用   Windows   身份登录  
  @pwd                   sysname=N''                 --密码    
  AS  
  SET   NOCOUNT   ON  
  DECLARE   @srvid   int,@Dbid   int,@S_dbid   int,@D_dbid   int,@TransferID   int,  
  @err   int,@src   varchar(255),   @desc   varchar(255)  
   
  IF   ISNULL(@ServerName,N'')=N''   SET   @ServerName=@@SERVERNAME  
  IF   ISNULL(@Source_DB,N'')=N''   SET   @Source_DB=DB_NAME()  
   
  --创建sqldmo对象·  
  EXEC   @err=sp_oacreate   'sqldmo.sqlserver',@srvid   OUT  
  IF   @err<>0   GOTO   lb_Err  
   
  --连接服务器  
  IF   ISNULL(@UserName,N'')=N''   --使用   Windows   身份登录  
  BEGIN  
  EXEC   @err=sp_oasetproperty   @srvid,'loginsecure',-1  
  IF   @err<>0   GOTO   lb_Err  
   
  EXEC   @err=sp_oamethod   @srvid,'connect',NULL,@servername  
  END  
  ELSE  
  EXEC   @err=sp_oamethod   @srvid,'connect',NULL,@servername,@UserName,@pwd  
   
  IF   @err<>0   GOTO   lb_Err  
   
  --获取数据库集  
  EXEC   @err=sp_oagetproperty   @srvid,'databases',@Dbid   OUT  
  IF   @err<>0   GOTO   lb_Err  
   
  --选择源数据库          
  EXEC   @err=sp_oamethod   @Dbid,'item',@S_dbid   OUT,@Source_DB  
  IF   @err<>0   GOTO   lb_Err  
   
  --选择目标数据库          
  EXEC   @err=sp_oamethod   @Dbid,'item',@D_dbid   OUT,@Des_DB  
  IF   @err<>0   GOTO   lb_Err  
   
  --设置复制的对象  
  EXEC   @err=sp_oacreate   'SQLDMO.Transfer',@TransferID   OUT  
  IF   @err<>0   GOTO   lb_Err  
   
  --设置目标服务器信息  
  EXEC   @err=sp_oasetproperty     @TransferID,'DestServer',@ServerName  
  IF   @err<>0   GOTO   lb_Err  
   
      --设置连接用户  
  IF   ISNULL(@UserName,N'')=N''   --使用   Windows   身份登录  
  BEGIN  
  EXEC   @err=sp_oasetproperty   @TransferID,'DestUseTrustedConnection',1  
  IF   @err<>0   GOTO   lb_Err  
  END  
  ELSE  
  BEGIN  
  EXEC   @err=sp_oasetproperty   @TransferID,'DestLogin',@UserName  
  IF   @err<>0   GOTO   lb_Err  
   
  EXEC   @err=sp_oasetproperty   @TransferID,'DestPassword',@pwd  
  IF   @err<>0   GOTO   lb_Err  
  END  
   
      --设置复制对象信息  
  EXEC   @err=sp_oasetproperty   @TransferID,'DestDatabase',@Des_DB  
  IF   @err<>0   GOTO   lb_Err  
   
  DECLARE   tb   CURSOR   FAST_FORWARD   LOCAL  
  FOR  
  SELECT   Name   FROM(  
  SELECT   KeyWord=N',D,',       Name=N'CopyAllDefaults'   UNION   ALL  
  SELECT   KeyWord=N',O,',       Name=N'CopyAllObjects'   UNION   ALL  
  SELECT   KeyWord=N',R,',       Name=N'CopyAllRules'   UNION   ALL  
  SELECT   KeyWord=N',P,',       Name=N'CopyAllStoredProcedures'   UNION   ALL  
  SELECT   KeyWord=N',T,',       Name=N'CopyAllTables'   UNION   ALL  
  SELECT   KeyWord=N',TR,',     Name=N'CopyAllTriggers'   UNION   ALL  
  SELECT   KeyWord=N',DT,',     Name=N'CopyAllUserDefinedDatatypes'   UNION   ALL  
  SELECT   KeyWord=N',V,',       Name=N'CopyAllViews'   UNION   ALL  
  SELECT   KeyWord=N',DATA,',Name=N'CopyData'   UNION   ALL  
  SELECT   KeyWord=N',DEL,',   Name=N'DropDestObjectsFirst'  
  )A   WHERE   CHARINDEX(KeyWord,  
  CASE   WHEN   ISNULL(@Obj_Type,N'')=''   THEN   ',O,DATA,'   ELSE   @Obj_Type   END)>0  
  OPEN   tb  
  FETCH   tb   INTO   @src  
  WHILE   @@FETCH_STATUS=0  
  BEGIN  
  EXEC   @err=sp_oasetproperty   @TransferID,@src,1  
  IF   @err<>0   GOTO   lb_Err  
  FETCH   tb   INTO   @src  
  END  
  CLOSE   tb  
  DEALLOCATE   tb  
   
  --复制对象  
  EXEC   @err=sp_oamethod   @S_dbid,'Transfer',null,@TransferID  
  IF   @err<>0   GOTO   lb_Err  
   
  --结束  
  SET   @err=0  
  GOTO   lb_Exit  
   
  --错误处理  
  lb_Err:  
  EXEC   sp_oageterrorinfo   NULL,   @src   OUT,   @desc   OUT    
  RAISERROR(N'错误编号   %#x,   错误源   "%s",   错误描述   "%s"',16,1,@err,@src,@desc)  
  RETURN   -1  
   
  lb_Exit:  
  EXEC   sp_OADestroy   @Dbid      
  EXEC   sp_OADestroy   @srvid    
  EXEC   sp_OADestroy   @TransferID    
  RETURN   @err  
  GO  
  Top

5 楼vivianfdlpw()回复于 2005-07-21 17:08:19 得分 0

你可以备份数据库,然后还原Top

6 楼zjcxc(邹建)回复于 2005-07-21 17:10:00 得分 0

 
  --只复制结构是这样调用的:  
  EXEC   P_CopyDB   @Source_DB='northwind',@Des_DB='test',@Obj_Type='O'  
  Top

7 楼zlp321002(Life Is Good,Let's Shine)回复于 2005-07-21 17:19:38 得分 0

--邹建又有新作品了。收藏下!就知道您有好东东   :DTop

8 楼zlt982001(乐天)回复于 2005-07-21 17:24:07 得分 0

该过程能否指定   需要复制得数据表  
  只需部分复制Top

9 楼zjcxc(邹建)回复于 2005-07-21 17:35:15 得分 0

可以,不过这样的话,存储过程就会写得比较麻烦,比较这种处理更适合用程序,而不是存储过程.  
   
  如果你要实现的话,你可以使用   Transfer   对象的   AddObjectByName   方法逐个添加要复制的对象,然后实现复制Top

10 楼zlt982001(乐天)回复于 2005-07-21 17:37:58 得分 0

解决一半   邹建请继续  
   
  指定数据表名,单个(做好多个)Top

11 楼zlt982001(乐天)回复于 2005-07-21 17:42:35 得分 0

对   SQL_DMO模型不大熟悉,能否贴一下大致得例子Top

12 楼Hopewell_Go(好的在后頭﹗希望更好﹗﹗)回复于 2005-07-21 19:53:23 得分 0

收藏!!Top

13 楼fengjianwei1982(小熊)回复于 2005-07-21 21:10:37 得分 0

收藏!!Top

14 楼zlt982001(乐天)回复于 2005-07-21 21:12:39 得分 0

结贴,使用   SQL_DMO   对象   完成操作  
  SQL_DMO   很强大,只是相关得帮助很少Top

相关问题

  • 求求各位..帮修改一通用存储过程..
  • 求一使用存储过程的通用方法
  • 这个通用查询分页存储过程错在那里。
  • 关于存储过程的复制问题
  • 求数据库表复制的存储过程!急
  • 在存储过程中有几种循环结构?
  • 存储过程中可以修改表的结构吗?求救!!!
  • 三层结构数据库中,怎样调用存储过程
  • 三层结构中,如何调用存储过程?
  • 谁能帮我写一个通用的生成交叉表的存储过程?

关键词

  • 存储过程
  • 结构
  • 数据库
  • sql
  • err
  • transferid
  • 复制
  • oasetproperty
  • goto lb
  • dbif

得分解答快速导航

  • 帖主:zlt982001
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo