小弟想把服务器上一个数据库里面的表结构包括全部约束(主键、外键……)都复制到另一个数据库里面。
 但是在这个数据库里面用 aspnet_regsql.exe 创建用户表了。一直复制不成功。
 不能把那些用户表删了,因为还有别人在用这个数据库。  复制 sql 数据库的 存储过程:-----------------------创建存储过程开始--------------------
if object_id('p_CopyDB') is not null
drop procedure p_CopyDB
go
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,@pwdIF @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_ErrDECLARE 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 -1lb_Exit:
    EXEC sp_OADestroy @Dbid 
    EXEC sp_OADestroy @srvid 
    EXEC sp_OADestroy @TransferID 
    RETURN @err
GO-----------------------创建存储过程结束--------------------