如何将一个数据库的表结构复制到另一个数据库

如何将一个数据库的表结构复制到另一个数据库,第1张

首先,打开并连接sql

server,在源数据库source_db(源数据库名称)上右键,然后依次点击“编写表脚本为”→“create到”→“新查询编辑器窗口”。

在第1步产生的编辑器中按”crtl+a“组合键全选内容,然后右键“复制“(或按"crtl+c"键)。

新建查询,然后右键”粘贴“(或ctrl+v);如图所示,将代码中source_db(源数据库名)改为target_db(目标数据库名)。接着右键单击”执行“执行代码。

然后,在目标数据库的表结构中就可以看到被复制过来的表了。

1.复制表结构:只能复制表的字段,不能复制主键、索引等

select top 0 * into 新表名 from 原表名

2.复制整个数据库结构及数据:

create datebase Test --创建目标数据库

exec P_CopyDB @Source_DB='aspnet',@Des_DB='test' --把源数据库整个复制到目标数据库

P_CopyDB存储过程创建过程如下

-----------------------创建存储过程开始--------------------

create proc P_CopyDB

@Des_DB sysname, --目标数据库

@Obj_Typenvarchar(4000)=N'',--复制的对象类型,可以是下列字符串列表:

-- O 所有对象,D 默认值,R 规则,P 存储过程

-- T 表,TR 触发器,DT 用户定义数据类型

-- V 视图,DATA 数据,DEL 删除目标对象

@Source_DB sysname=N'', --源数据库

@ServerName sysname=N'', --服务器名

@UserNamesysname=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='.'--默认为本地数据库

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

-----------------------创建存储过程结束--------------------


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10829120.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存