您的位置:首页 > 数据库

如何用SQL语句复制表的结构、复制整个数据库?

2012-11-13 19:08 302 查看
1.复制表结构:只能复制表的字段,不能复制主键、索引等

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

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

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

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

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

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

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

-----------------------创建存储过程结束--------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: