如何在SQL Server中刷新C# CLR代码(程序集)?

3

我实现了一个CLR存储过程的"HelloWorld"示例,它运行正常。

然后我更改了代码,重新编译并运行它,但是得到的是旧的结果,而不是新的结果。

代码更改示例(其他所有代码都在上面的链接中):

之前:

SqlContext.Pipe.Send("Hello world!\n");

之后:

SqlContext.Pipe.Send("Hello world new version!\n");

除了重新加载 SQL 以获取新的程序集外,还有其他方法吗?


你能否发布你所拥有的代码,以及实际结果和期望结果? - admdrew
你需要重新部署你的程序,而不仅仅是重新编译它。 - Matt Whitfield
@admdrew 实际的代码在我给出的链接中。我只是改变了问题以展示我所做的更改。 - NealWalters
@Matt - 这就是问题所在,如何部署。我最初是通过添加程序集和存储过程来进行部署的。我没有使用Visual Studio进行部署。 - NealWalters
2个回答

6

假设你已经用C#创建了一个CLR函数HelloSQLCLR()
在调用它之前,你需要完成以下步骤:
启用SQLCLR

sp_configure 'clr_enabled', 1
GO
RECONFIGURE
GO

安装并注册HelloSQLCLR

安装(将目录更改为实际位置)

CREATE ASSEMBLY MyUDFsLib
    FROM 'C:\Path_To_Your_DLL\HelloSQLCLR.dll'
GO

注册

CREATE FUNCTION dbo.HelloSQLCLR()
    RETURNS NVARCHAR(50)
    EXTERNAL NAME MyUDFsLib.MyUDFs.HelloSQLCLR;

测试它

SELECT dbo.HelloSQLCLR() 

编辑
如果您已更改代码,请尝试以下操作

ALTER ASSEMBLY MyUDFsLib 
FROM 'C:\Path_your_changed_Recomplied_DLL\.dll' 

很好的回答,但不是我的问题。我已经完成了那些步骤。现在我改变了代码,但它仍然运行旧代码,旧程序集仍然被加载。 - NealWalters
@NealWalters:最后一步,ALTER ASSEMBLY ... 应该刷新为新的位。 - Remus Rusanu
1
谢谢,我只需要最后那个ALTER语句。我实际上尝试过删除程序集,但由于程序集在存储过程中使用,所以不允许我仅删除程序集而不删除两者。 - NealWalters

0

您需要重新创建基于CLR的存储过程,仅更改DLL是不够的。


好的,这里有一个变化。我现在正在创建一个函数,而且方法是私有的。创建函数失败了。我将私有更改为公共,重新编译。我甚至删除了程序集并重新添加了它。但是现在,每次我尝试创建该函数时,它仍然将代码视为私有而不是公共。因此,它使用缓存的 DLL 而不是我的新 .DLL。 - NealWalters
我删除并重新添加了存储过程,但结果仍然相同。顺便说一下,SPROC上有一个小锁符号。这是什么原因? - NealWalters
锁定意味着你的存储过程已被加密。 - Szymon
您需要再次使用 ALTER ASSEMBLY 或 CREATE ASSEMBLY。这是 dll 代码“缓存”的步骤。 - Anatoli Klamer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接