一点历史: 两年前,我们成功地为SQL Server构建了.NET CLR代码,编译成一个程序集,并将其加载到SQL Server 2008 R2 Enterprise数据库中。然后,我们创建了TSQL对象来调用CLR代码。自从第一次安装以来,这一切都没有出现问题,并且我们在过去的几年中进行了修改而没有出现问题。
今天: 我们需要修改CLR代码。在Visual Studio中进行此操作不会导致编译程序集时出现任何问题。被TSQL引用的函数的签名没有发生任何变化(所有参数、参数类型等都没有发生变化)。修改是为了重新设计一些函数的基础代码并创建一些新函数(所有这些函数都是私有静态的,不会在TSQL中被引用)。我们现在使用的是SQL Server 2012 Enterprise(升级于2015年中顺利进行,并且现在DB处于2012兼容模式)。
我可以成功地在SQL Server中删除和重新创建程序集。当重新创建依赖程序集的TSQL对象时,一些绑定到CLR函数签名的对象没有问题,但是被重新设计的一个对象无法重新创建。错误信息如下:
Msg 6550, Level 16, State 2, Procedure udfGetCellValueCLR, Line 2
CREATE FUNCTION failed because parameter counts do not match.
参数没有任何变化。当我查看Visual Studio自动生成的TSQL代码来创建TSQL函数,并尝试使用该代码创建一个函数时,它也会出现相同的错误消息,因此我知道TSQL代码是正确的(没有遗漏参数、顺序、类型等)。
感觉可能与升级到2012的DB有关。我已经尝试编译程序集,将其针对.NET 3.5和.NET 4.0以及针对2008 R2数据库和2012数据库进行定位(因此有4个组合)。DB本身正在使用.NET 4.0,因为它处于2012兼容模式下。
数据库确实启用了CLR。
有什么想法可以让这个工作吗?目前谷歌没有帮到我。
编辑
确切的函数签名(直接从Visual Studio复制)如下(在我们的测试中,已将很多内容传递给了CLR代码查询数据,显示出比传递所有内容更差的性能)。
TSQL CREATE FUNCTION语句如下(这是出错的语句)。
CREATE FUNCTION [be].[udfGetCellValueCLR]( @MetricID [int], @CSVDimensionList [nvarchar](4000), @AggregationSQLString [nvarchar](4000), @DateColumnForAverage [nvarchar](4000), @TimeFrameIsAVariance [bit], @TimeFrameIsAPlan [bit], @IsAnAverage [bit], @TimeFrameIsPercentOfTotal [bit], @AggregationAllowsPercentOfTotal [bit], @PlanAggregationAllowsPercentOfTotal [bit], @MetricIsAPercentage [bit], @GoodDirection [int], @PlanMetricID [int], @PlanAggregationSQLString [nvarchar](4000), @StartDateID [int], @EndDateID [int], @NumeratorIsAPlan [bit], @NumeratorIsAnAverage [bit], @NumeratorStartDateID [int], @NumeratorEndDateID [int], @NumeratorDateColumnForAverage [nvarchar](4000), @DenominatorIsAPlan [bit], @DenominatorIsAnAverage [bit], @DenominatorStartDateID [int], @DenominatorEndDateID [int], @DenominatorDateColumnForAverage [nvarchar](4000), @SpecialAggregation [nvarchar](4000) ) 返回[float],使用CALLER权限执行 作为外部名称[EMMACustomCode]的[UserDefinedFunctions].[udfGetCellValueCLR] GO
CREATE FUNCTION
代码 - thomasSql*
类型。我怀疑这不是问题,但这是一个区别。理想情况下,所有参数都应该是SqlBoolean
,SqlString
,SqlInt32
等类型。 - Solomon Rutzky.msi
下载,安装起来非常快速(没有服务等)。 - Solomon Rutzky