如何在不从SQL Server中删除程序集的情况下更新CLR程序集

如何更新CLR函数(或过程)程序集dll而不必删除并重新创buildSQL Server(2008 R2)中的程序集?

现在,如果我更新程序集(例如添加一个新的函数),SQL Server将不会兑现更新的DLL,直到我删除程序集:

DROP ASSEMBLY CLRFunctions Msg 6590, Level 16, State 1, Line 1 DROP ASSEMBLY failed because 'CLRFunctions' is referenced by object 'NormalizeString'. 

但是在我可以删除程序集之前,我必须先删除引用它的所有函数

 DROP FUNCTION NormalizeString DROP FUNCTION RemoveDiacritics DROP FUNCTION RemoveCombiningDiacritics DROP FUNCTION CombineLigatures .... DROP FUNCTION PseudolocalizeArabic 

然后,我可以放弃大会:

 DROP ASSEMBLY CLRFunctions 

现在我必须“ 创build ”程序集:

 CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll'; 

现在,我必须寻找在我删除之前注册的所有UDF的声明。

我宁愿更新程序集,并让SQL Server开始使用它。


更新 :我随机尝试DBCC FREEPROCCACHE强制“重新编译”,但SQL Server仍然使用旧的代码。

更新 :我删除了程序集DLL CLRFunctions.dll ,并且SQL Server仍然能够运行代码(没有代码应该是不可能的)。

我想你正在寻找alter assembly 。 从BOL:

如果指定了FROM子句,ALTER ASSEMBLY会根据提供的模块的最新副本更新程序集。 由于在已经针对程序集定义的SQL Server实例中可能存在CLR函数,存储过程,触发器,数据types和用户定义的集合函数,因此ALTER ASSEMBLY语句将它们重新绑定到程序集的最新实现。 要完成这种重新绑定,映射到CLR函数,存储过程和触发器的方法必须仍然存在于具有相同签名的修改后的程序集中。 实现CLR用户定义types和用户定义聚合函数的类仍然必须满足作为用户定义types或聚合的要求。

在同一个页面上的一个例子似乎可以做到这一点:

 ALTER ASSEMBLY ComplexNumber FROM 'C:\Program Files\Microsoft SQL Server\90\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll' 

要添加到Ben Thul的答案,可以通过SQL Server Management Studio的GUI非常容易地远程完成。

  1. 在您的数据库的对象资源pipe理器 – >可编程性下,右键单击assembly,然后select“新assembly…”。

  2. 浏览到您更新的DLL。

  3. 而不是点击“确定”(这将失败,因为已经存在同名的程序集),点击新buildassembly窗口顶部的“脚本”。

    您将被拖放到包含“CREATE ASSEMBLY”行的SQL查询中,之后是一个巨大的blob,即您刚刚select的DLL。

  4. 将“CREATE”更改为“ALTER”,然后执行!

脚本还为我创build了一个“授权”行,在执行之前必须将其删除。 你的milage可能会有所不同。

我希望这可以帮助别人没有文件系统访问他们的服务器。

希望微软有朝一日能让SSMS成为一stream的操作系统,但这是一个相当简单的解决方法,直到他们这样做。

我在Stackoverflow上find了一个提示:

 ALTER ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';