使用存储过程复制表结构

Posted on 2008-07-10 11:48 沙龙 阅读(401) 评论(0)  编辑 收藏 引用 所属分类: 数据库

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 实现数据迁移

存储过程实现源数据库到目标数据库的对象和数据的复制

要求源数据库和目标数据库在同一服务器

如果是要实现不同服务器之间的复制,则需要增加验证信息

--邹建2005.07(引用请保留此信息)--*/


/*--调用示例


CREATE DATABASE test

EXEC P_CopyDB @Source_DB='northwind', @Obj_Type=',T,V,TR,P,', @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

只有注册用户登录后才能发表评论。

posts - 19, comments - 5, trackbacks - 0, articles - 5

Copyright © 沙龙