【问题标题】:How refresh to refresh C# CLR code (assembly) in SQL Server?如何在 SQL Server 中刷新以刷新 C# CLR 代码(程序集)?
【发布时间】:2013-11-15 13:38:21
【问题描述】:

我实现了"HelloWorld" sample of a CLR stored procedure,它成功了。

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

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

之前:

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

之后:

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

有没有什么可以回收 SQL 来加载新的程序集?

【问题讨论】:

  • 您能否发布您拥有的代码以及实际结果和预期结果?
  • 你需要重新部署你的程序,而不仅仅是重新编译它。
  • @admdrew 实际代码在我提供的链接中。我只是更改了问题以显示我所做的更改。
  • @Matt - 这就是问题,如何部署。我最初是通过添加程序集和添加存储过程来部署的。我没有从 Visual Studio 部署。

标签: sql-server sql-server-2008 sqlclr clrstoredprocedure


【解决方案1】:

假设您在 C# 中创建了一个 CLR 函数 HelloSQLCLR()
您需要执行以下步骤才能在 Sql Server 中调用它
启用 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:最后一步,ALTER ASSEMBLY ... 应该刷新到新位。
  • 谢谢,我只需要最后一个 ALTER 语句。我实际上曾尝试删除程序集,但由于程序集是在存储过程中使用的,所以如果不删除两者,我就不会这样做。
  • @NealWalters 没问题,很高兴它有帮助:)
【解决方案2】:

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

【讨论】:

  • 好的,这是一个变体。我现在正在创建一个函数,并且这些方法是私有的。创建函数失败。我将私有更改为公共,重新编译。我什至删除了程序集并重新添加了它。但是现在,每次我尝试创建函数时,它仍然将代码视为私有而不是公共。所以它使用缓存的 DLL 而不是我的新 .DLL
  • 我删除并读取了存储过程,得到了相同的结果。顺便说一句,SPROC 上有一个小锁符号。是什么原因造成的?
  • 锁定意味着您的存储过程已加密。
  • 您需要再次使用 ALTER ASSEMBLY 或 CREATE ASSEMBLY。这是 dll 的代码“缓存”时的步骤
猜你喜欢
  • 2011-09-15
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 2012-04-22
相关资源
最近更新 更多