241.在两个SQL Server数据库之间复制对象

CREATE PROC sp_CopyObject
@S_DatabaseName sysname,             --要复制对象的源数据库名
@D_DatabaseName sysname=NULL,      --复制对象的目标数据库名,不指定则为当前库名
@TypeList        nvarchar(50)=NULL   --以逗号分隔的对象类型列表,只能是P/V/TR/IF/TF/FN之一或者是它们的组合.不指定是所有对象
AS
IF DB_ID(@S_DatabaseName) IS NULL
BEGIN
	RAISERROR('源数据库 "%s" 不存在',12,16,@S_DatabaseName)
	RETURN
END
IF DB_ID(@D_DatabaseName) IS NULL SET @D_DatabaseName=DB_NAME()

DECLARE @sql nvarchar(4000)
--处理对象类型列表
SET @sql=N''
SELECT @sql=@sql+N','+QUOTENAME(xtype,N'''')
FROM(
	SELECT xtype=N'P'  UNION ALL SELECT N'IF' UNION ALL
	SELECT xtype=N'V'  UNION ALL SELECT N'TF' UNION ALL
	SELECT xtype=N'TR' UNION ALL SELECT N'FN'
)a WHERE CHARINDEX(N','+xtype+N',',N','+@TypeList+N',')>0
IF @@ROWCOUNT=0 OR @sql=''
	SET @TypeList='N''P'',N''V'',N''TR'',N''IF'',''TF'',''FN'''
ELSE
	SET @TypeList=STUFF(@sql,1,1,N'')

--获取要复制对象(存储,视图,触发器)的数据
CREATE TABLE #(name sysname,xtype char(2),number smallint,colid smallint,text nvarchar(4000))
SET @sql=N'
INSERT #(name,xtype,number,colid,text)
SELECT o.name,o.xtype,m.number,m.colid,m.text
FROM '+QUOTENAME(@S_DatabaseName)+N'.dbo.sysobjects o,'
	+QUOTENAME(@S_DatabaseName)+N'.dbo.syscomments m
WHERE o.id=m.id
	AND m.encrypted=0
	AND o.xtype IN('+@TypeList+N')
	AND o.status>=0'
EXEC sp_executesql @sql

DECLARE tb CURSOR LOCAL
FOR
SELECT N'USE '+QUOTENAME(@D_DatabaseName)+N'
	DECLARE @name sysname,@number smallint
	SELECT @name='+QUOTENAME(name,N'''')+N',
		@number='+CAST(number as varchar)+N'
	DECLARE @1 nvarchar(4000),@2 nvarchar(4000),@3 nvarchar(4000),@4 nvarchar(1000)
	SELECT @1=N'''',@2=N'''',@3=N''''
	SELECT @1=@1+N'',@''+RTRIM(colid)+N'' nvarchar(4000)'',
		@2=@2+N'',@''+RTRIM(colid)
			+N''=CASE colid WHEN ''+RTRIM(colid)
			+N'' THEN text ELSE @''+RTRIM(colid)+N'' END'',
		@3=@3+N''+@''+RTRIM(colid)	
	FROM #
	WHERE name=@name AND number=@number
	ORDER BY colid
	SELECT @1=STUFF(@1,1,1,N''''),
		@2=STUFF(@2,1,1,N''''),
		@3=STUFF(@3,1,1,N''''),
		@4=N'' WHERE name=''+QUOTENAME(@name,N'''''''')
			+N'' AND number=''+RTRIM(@number)
	IF @NUMBER<2 AND EXISTS(SELECT * FROM sysobjects WHERE name=@name AND xtype='
	+QUOTENAME(xtype,N'''')+N') DROP '+CASE xtype
		WHEN N'P' THEN N'PROC'
		WHEN N'V' THEN N'VIEW'
		WHEN N'TR' THEN N'TRIGGER'
		ELSE N'FUNCTION' END
	+N' '+QUOTENAME(name)+N'
	EXEC(N''DECLARE ''+@1+''
	SELECT ''+@2+'' FROM # ''+@4+N''
	EXEC(''+@3+'')'')'
FROM #
GROUP BY name,xtype,number
OPEN tb
FETCH tb INTO @sql
WHILE @@FETCH_STATUS=0
BEGIN
	EXEC sp_executesql @sql
	FETCH tb INTO @sql
END
CLOSE tb
DEALLOCATE tb
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值