在SQL 2017中使用SQL 2016进行汇编(例如:从SQL Server 2017调用Math Parser)

时间:2017-12-29 00:47:28

标签: sql-server sql-server-2017

我有一个存储过程需要一些复杂的数学表达式评估。 有一个公式,这个存储过程会评估它的值。

它调用如下定义的UDF:

ALTER FUNCTION [dbo].[udfComputeMath]
    (@inputString [NVARCHAR](MAX))
RETURNS [NVARCHAR](4000) 
WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [SMP_Assembly].[SuperMathParser.MathParser].[ComputeMath] 

这是非常古老的代码,自SQL Server 2008 R2(至少)以来,它工作得很好,直到2016年。

但是现在我们尝试将我们的数据库更新为SQL Server 2017,这不再有效。

我收到以下错误:

  

Msg 10314,Level 16,State 11,Procedure GetPermitTypeFeesByPermitID,Line 88 [Batch Start Line 0]
  尝试加载程序集ID 65536时,Microsoft .NET Framework中发生错误。服务器可能资源不足,或者程序集可能不受信任。再次运行查询,或检查文档以了解如何解决程序集信任问题。有关此错误的详细信息:

     

System.IO.FileLoadException:无法加载文件或程序集' supermathparser,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'或其中一个依赖项。发生了与安全性有关的错误。 (来自HRESULT的异常:0x8013150A)System.IO.FileLoadException:

     

at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks)

     

at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,Evidence assemblySecurity,RuntimeAssembly reqAssembly,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks)

     

at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString,Evidence assemblySecurity,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean forIntrospection)

     

在System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString,Evidence assemblySecurity,StackCrawlMark& stackMark,Boolean forIntrospection)System.Reflection.Assembly.Load(String assemblyString)

任何想法如何在SQL Server 2017中再次使用它?

谢谢

2 个答案:

答案 0 :(得分:2)

我的假设是你尝试调用它的数据库刚刚恢复到SQL Server 2017数据库,这是正确的吗?如果是这样,您尝试调用的函数要么由您自己开发(公司),要么是第三方程序集 - 它不是内置的MS程序集(程序集ID - 65536 - 也表示这一点)。

我的猜测是问题是digital.aaron在他的评论中指出的问题,它与SQL Server 2017中更改的CLR安全模型有关。您可以在this blogpost和{{{}}中了解更多相关信息。 {3}}一种轻松的方法:ish修复它。

希望这有帮助!

尼尔斯

答案 1 :(得分:1)

指向“轻松修复”的链接不起作用,更多上下文可能会更有用。我最终通过以下步骤(在master上运行)快速又肮脏:

ALTER DATABASE <DatabaseName> SET trustworthy ON

此处链接的博客文章仍然有效,而且内容丰富