为什么CREATE ASSEMBLY失败并显示错误'无法解析令牌'?

时间:2010-07-30 11:04:17

标签: sql-server-2005 sqlclr clrstoredprocedure

我正在使用一些用C#编写的SQL 2005 CLR代码。我们最近改变了一些函数以允许NULL参数。我们通过将参数从“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.

我用Google搜索了这个错误,但似乎找不到任何合理的错误。在我们所做的更改中,没有新的或更改的引用,所以我不相信它与服务器中遗漏的任何内容有关,代码之前已在那里工作了很长一段时间。有谁知道这里发生了什么?

2 个答案:

答案 0 :(得分:0)

这不是我自己的问题的答案,但它确实提供了一个线索,并且 - 非常有用 - 是一种解决方案,因此它可以帮助处于类似情况的人。

我上面提到的部署脚本是通过编写开发数据库对象的脚本来创建的。而不是这样做,我发现如果我:

  1. 启动SQL事件探查器,捕获针对我的开发数据库执行的SQL语句。
  2. 使用Visual Studio中的“部署”功能将项目部署到我的SQL Server。
  3. 选择SQL事件探查器文件 - >出口 - >提取SQL Server事件 - >提取Transact-SQL事件菜单选项以将捕获的解组SQL保存到文件中。
  4. 使用文本编辑器稍微清理文件。
  5. 在生产服务器上运行捕获的SQL。
  6. 然后它起作用: - )

    因此,与Visual Studio生成的部署脚本相比,我在部署对象后创建的脚本之间必定存在一些差异。

    这并不能解释“无法解决令牌”问题,但它确实可以让我们知道正在发生的事情,更重要的是,它可以解决这个问题。

    那就是说,我仍然很想知道“无法解决令牌”的错误意味着......

答案 1 :(得分:0)

我遇到了一个类似的莫名其妙的错误,关于"无法解析令牌"对于我的程序集中存在的方法。只有将目标平台从.NET 4.5更改为.NET 4.0才能让它工作。关于为什么可能有效的一些长期解释是in this msdn blog