日期:2014-05-17  浏览次数:20539 次

如何复制SQL Server 2008 的CLR扩展到别的数据库
我的一个数据有一些用.NET开发的存储过程和自定义函数
那是直接添加到数据库的,没有DLL文件,也没有源代码
请问我可以把这些存储过程和函数复制到别的数据库吗?
需要怎么操作,还有有没有办法可以反编译出这些对象的.NET源代码呢?

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

楼上还是没解决我的问题,我讲啦,手工方法我会啊
但有时候你是不能登录数据库服务器的电脑的,那么我怎么导出文件呢
我只能通过连接进入数据库,能不能不通过SQL Server Management Studio
而直接就通过连接使用SQL语句把该数据库的CLR部分拷贝下来然后添加到别的数据库


可以的哈,我现在已经实现了拷贝clr了,还需要进一步把基于clr的函数定义给弄出来

等待你的好消息,希望能给出一个完整的SQL代码,最好不需要增加其它函数之类的啦


我先写成这样,下面的代码能动态产生创建clr程序集的sql语句,还能产生基于clr程序集的用户定义函数的创建sql语句,你先试试:

user 你的数据库
go

--1.产生crl程序集的sql

--定义表变量,临时存储中间结果集
declare @tb table
(
name nvarchar(100),
permission_set int,
content varbinary(max),
rownum int,
create_clr_sql nvarchar(max)
);

insert into @tb
select a.name,
       a.permission_set,
       af.content,
       ROW_NUMBER() over(order by @@servername) as rownum,
       null
from sys.assembly_files af
inner join sys.assemblies a
        on af.assembly_id = a.assembly_id
where a.is_user_defined = 1


--select * from @tb

--从表变量中每次取出一条数据,通过内存循环把varbinary转化为varchar
--最后,拼接产生clr的sql语句,update到表变量中的create_clr_sql字段中 
declare @outer_i int;  --外层循环变量
declare @count int;   
 
declare @bin varbinary(max)
declare @bin_convert_varchar varchar(max)
declare @inner_i int   --内存循环变量

set @outer_i = 1;
set @count = (select COUNT(*) from @tb);

while @outer_i <= @count
begin
   set @bin = (select content from @tb where rownum = @outer_i)

   select @bin_convert_varchar = '',
          @inner_i = datalength(@bin);
       
   while @inner_i>0
   begin
     select @bin_convert_varchar=
                substring('0123456789ABCDEF',substring(@bin,@inner_i,1)/16+1,1)+
                substring('0123456789ABCDEF',substring(@bin,@inner_i,1)%16+1,1)+
                @bin_convert_