Sql server 2005 为什么创建程序集失败并出现错误“无法解析令牌”?

Sql server 2005 为什么创建程序集失败并出现错误“无法解析令牌”?,sql-server-2005,sqlclr,clrstoredprocedure,Sql Server 2005,Sqlclr,Clrstoredprocedure,我正在使用一些用C编写的SQL 2005 CLR代码。我们最近修改了一些函数以允许空参数。为此,我们将参数从“double”类型更改为“SqlDecimal”类型。我们成功地测试了开发中的更改,并将更新部署到生产服务器。我们使用SQL脚本从服务器中删除现有代码,然后创建更新的程序集和相关对象。我们在开发和测试中使用的SQL脚本已部署到生产服务器,没有任何更改,但在那里运行时,我们看到一个错误: Creating CLR assemblies Msg 6218, Level 16, State 2

我正在使用一些用C编写的SQL 2005 CLR代码。我们最近修改了一些函数以允许空参数。为此,我们将参数从“double”类型更改为“SqlDecimal”类型。我们成功地测试了开发中的更改,并将更新部署到生产服务器。我们使用SQL脚本从服务器中删除现有代码,然后创建更新的程序集和相关对象。我们在开发和测试中使用的SQL脚本已部署到生产服务器,没有任何更改,但在那里运行时,我们看到一个错误:

Creating CLR assemblies
Msg 6218, Level 16, State 2, Line 2
CREATE ASSEMBLY for assembly 'Company.Db.CLRStoredProcedures' failed because assembly 'Company.Db.CLRStoredProcedures' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message
[ : StoredProcedures::clrproc_OSGBtoWGS84][mdToken=0x600002e][offset 0x0000002C] Unable to resolve token.

我用谷歌搜索了这个错误,但似乎找不到任何合理的东西。在我们所做的更改中,没有新的或更改的引用,因此我不认为这与服务器中缺少的任何内容有关,代码以前在那里工作了很长一段时间。有人知道这里发生了什么吗?

这不是我自己问题的答案,但它确实给出了发生了什么的线索,非常有用的是,这是一个解决办法,因此它可能会帮助处于类似情况的人

我上面提到的部署脚本是通过编写开发数据库对象的脚本创建的。相反,我发现如果我:

启动SQL分析器,捕获针对我的开发数据库执行的SQL语句。 使用Visual Studio中的“部署”功能将项目部署到我的SQL Server。 选择SQL探查器文件->导出->提取SQL Server事件->提取Transact-SQL事件菜单选项,将捕获的解聚SQL保存到文件中。 使用文本编辑器稍微清理一下文件。 在生产服务器上运行捕获的SQL。 然后它就起作用了:-

因此,我在部署对象后创建的脚本与VisualStudio生成的部署脚本之间肯定存在一些差异

这并不能解释“无法解决代币”的问题,但它可能给了我们一个线索,以及更重要的是,一种解决方法


这就是说,我仍然渴望理解“无法解析令牌”错误的含义……

我遇到了一个类似的无法解释的错误,关于无法解析程序集中存在的方法的令牌。只有将目标平台从.NET4.5更改为.NET4.0,我才能让它正常工作。关于这可能起作用的原因,有一些详细的解释。

无法解析令牌,意味着它找不到元数据。不过我不能给你更多的信息,我自己也在调试一个类似的问题。我非常怀疑脚本和你捕获的内容有什么不同。您也没有指定正在使用哪个版本的VisualStudio,部署/发布的方式已经更改了几次。因此,为了真正弄清楚这一点,我们需要查看您正在使用的获取错误的部署脚本,以及正在工作的脚本。否则,这里就没有足够的信息继续下去了。这个问题已经有5年了,所以在我的技术档案中有很多尘封的地方!鉴于时间流逝,我现在无法提供任何其他信息。我认为这一解释与您的问题无关,因为您在这两种情况下都使用CLR 4.0 csc,但这是该博文中的主要问题。在部署程序集的服务器上是否安装了.NET 4.5?在您的情况下,您可能是在一台有.NET 4.5的机器上开发的,但部署到一台没有应用.NET 4.5更新的机器上。是的,您是对的,SQL Server没有4.5。我安装了它并重新定位了.NET4.5的项目,发布到SQLServer,所有这些都成功了。是的,这和OP的问题无关。