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

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

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

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

CREATE DATABASETest      --创建目标数据库
EXEC   P_CopyDB@Source_DB='aspnet',@Des_DB='test'   --把源数据库整个复制到目标数据库

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

CREATE PROCEDUREP_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,@TransferIDint,
    @errint,@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(
    SELECTKeyWord=N',D,',  Name=N'CopyAllDefaults' UNION ALL
    SELECTKeyWord=N',O,',  Name=N'CopyAllObjects' UNION ALL
    SELECTKeyWord=N',R,',  Name=N'CopyAllRules' UNION ALL
    SELECTKeyWord=N',P,',  Name=N'CopyAllStoredProcedures' UNION ALL
    SELECTKeyWord=N',T,',  Name=N'CopyAllTables' UNION ALL
    SELECTKeyWord=N',TR,',  Name=N'CopyAllTriggers' UNIONALL
    SELECTKeyWord=N',DT,', Name=N'CopyAllUserDefinedDatatypes' UNION ALL
    SELECTKeyWord=N',V,',  Name=N'CopyAllViews' UNION ALL
    SELECTKeyWord=N',DATA,',Name=N'CopyData' UNION ALL
    SELECTKeyWord=N',DEL,', Name=N'DropDestObjectsFirst'
)A WHERE CHARINDEX(KeyWord,
       CASE WHEN ISNULL(@Obj_Type,N'')='' THEN ',O,DATA,' ELSE @Obj_TypeEND)>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 tbINTO @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:
    EXECsp_oageterrorinfo NULL, @src OUT, @desc OUT
   RAISERROR(N'错误编号 %#x, 错误源 "%s", 错误描述"%s"',16,1,@err,@src,@desc)
    RETURN-1

lb_Exit:
    EXECsp_OADestroy @Dbid 
    EXECsp_OADestroy @srvid
    EXECsp_OADestroy @TransferID
    RETURN@err
GO

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值