Sql server SQL Server 2012 CLR程序集-参数计数不';不匹配

Sql server SQL Server 2012 CLR程序集-参数计数不';不匹配,sql-server,sql-server-2008-r2,sql-server-2012,sql-server-data-tools,sqlclr,Sql Server,Sql Server 2008 R2,Sql Server 2012,Sql Server Data Tools,Sqlclr,一点历史:我们(2年前)成功地为SQL Server构建了.NET CLR代码,编译成程序集,并加载到SQL Server 2008 R2企业数据库中。然后我们创建了TSQL对象来调用CLR代码。自从第一次安装以来,它一直没有问题,我们多年来一直在修改它,没有问题 今天:我们需要修改CLR代码。在Visual Studio中执行此操作不会导致编译到程序集的问题。TSQL引用的函数的签名根本没有更改(所有参数、参数类型等都没有更改)。修改的目的是重新分解函数中的一些底层代码,并创建两个新函数(所有

一点历史:我们(2年前)成功地为SQL Server构建了.NET CLR代码,编译成程序集,并加载到SQL Server 2008 R2企业数据库中。然后我们创建了TSQL对象来调用CLR代码。自从第一次安装以来,它一直没有问题,我们多年来一直在修改它,没有问题

今天:我们需要修改CLR代码。在Visual Studio中执行此操作不会导致编译到程序集的问题。TSQL引用的函数的签名根本没有更改(所有参数、参数类型等都没有更改)。修改的目的是重新分解函数中的一些底层代码,并创建两个新函数(所有函数都是私有静态的,不会在TSQL中引用)。我们现在使用的是SQL Server 2012 Enterprise(升级在2015年年中顺利完成,数据库现在处于2012兼容模式)

我可以在SQL Server中成功删除并重新创建程序集。当重新创建依赖于程序集的TSQL对象时,一些绑定到CLR函数签名没有问题,但重新分解的对象不会重新创建。此错误消息不正确

Msg 6550, Level 16, State 2, Procedure udfGetCellValueCLR, Line 2
CREATE FUNCTION failed because parameter counts do not match.
参数没有任何变化。当我查看VisualStudio自动创建的TSQL代码以创建TSQL函数并尝试使用该代码创建一个函数时,同样的消息也会失败,因此我知道TSQL代码是正确的(不缺少参数、顺序、类型等)

感觉到数据库升级到2012年可能会发生一些事情。我曾尝试编译针对.NET 3.5和.NET 4.0以及针对2008 R2数据库和2012数据库(so 4组合)的程序集。DB本身正在使用.NET 4.0,因为它处于2012兼容模式

数据库没有启用CLR

你有什么想法可以让它工作吗?到目前为止,谷歌让我失望

编辑

下面是确切的函数签名(直接从VisualStudio中复制出来)(是的,很多函数都被传递到了这个函数签名中,而不是使用CLR代码查询数据,在我们的测试中,这些数据的性能比传递所有数据都差)

[Microsoft.SqlServer.Server.SqlFunction(DataAccess=DataAccessKind.Read)] 公共静态SqlDouble udfGetCellValueCLR( int MetricID, 字符串CSVDimensionList, 字符串聚合SqlString, 字符串DateColumnForAverage, 布尔时间框架, bool时间表计划, 布尔·伊萨纳韦拉奇, bool时间框架超过总时间, bool AggregationAllowsPercentOfTotal, 布尔平面总面积, 布尔度量单位, int GoodDirection, int PlanMetricID, string PlanAggregationSQLString, int StartDateID, int EndDateID, 布尔数学家萨普兰, 布尔数学家平均数, int NumeratorStartDateID, int NumeratorEndDateID, 字符串NumeratorDateColumnForAverage, 布尔·多米诺里萨普兰, 布尔分母平均数, int分母起始日期ID, int分母EndDateId, 字符串分母DateColumnForAverage, SqlString特殊聚集 ) 下面是TSQL CREATE FUNCTION语句(这是一条出错的语句)

创建函数[be]。[udfGetCellValueCLR]( @MetricID[int], @CSVD尺寸列表[nvarchar](4000), @AggregationSQLString[nvarchar](4000), @DateColumnForAverage[nvarchar](4000), @时间框架方差[bit], @时间框架计划[bit], @IsAnAverage[位], @时间框架Percentoftotal[bit], @AggregationAllowsPercentOfTotal[bit], @平面聚合LowSpercentoftotal[bit], @MetricIsAPercentage[位], @GoodDirection[int], @PlanMetricID[int], @PlanAggregationSQLString[nvarchar](4000), @StartDateID[int], @EndDateID[int], @NumeratorisPlan[位], @数值平均[位], @NumeratorStartDateID[int], @NumeratorRendDateId[int], @NumeratorDateColumnForAverage[nvarchar](4000), @分母APLAN[位], @分母平均值[位], @分母起始日期ID[int], @DenominorendDateId[int], @DenominOrDateColumnForAverage[nvarchar](4000), @特殊分类[nvarchar](4000) ) 返回[float],执行为调用者 作为 外部名称[EMMACustomCode]。[UserDefinedFunctions]。[udfGetCellValueCLR] 去
如果参数列表不匹配,那么实际上程序集(已经加载到SQL Server中的程序集)和
CREATE FUNCTION
语句之间存在差异

如果您使用Visual Studio/SQL Server数据工具(SSDT)生成程序集和T-SQL包装器对象,则需要注意SSDT生成的SQL脚本有两种类型:创建脚本和发布/部署脚本

创建脚本不假设脚本部署的当前状态。如果目标数据库已经存在,他们将删除它,然后重新创建数据库并加载所有对象(Assembly和T-SQL包装器对象)。并非总是生成“{ProjectName}\u Create.sql”脚本。“项目属性”的“项目设置”选项卡上通常有一个选项(复选框),用于创建此脚本。此脚本不会部署,它只是供您获取

发布/部署脚本是增量部署。SSDT首先检查目标数据库的当前状态,然后仅进行必要的更改,使目标达到项目中的状态(即生成的
.dacpa),从而创建这些数据库
[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
    public static SqlDouble udfGetCellValueCLR( 
        int MetricID, 
        string CSVDimensionList, 
        string AggregationSQLString, 
        string DateColumnForAverage,                         
        bool TimeFrameIsAVariance,
        bool TimeFrameIsAPlan,
        bool IsAnAverage,
        bool TimeFrameIsPercentOfTotal,
        bool AggregationAllowsPercentOfTotal,
        bool PlanAggregationAllowsPercentOfTotal,
        bool MetricIsAPercentage,
        int GoodDirection,
        int PlanMetricID,
        string PlanAggregationSQLString,                                                             
        int StartDateID, 
        int EndDateID,                                      
        bool NumeratorIsAPlan,
        bool NumeratorIsAnAverage,
        int NumeratorStartDateID,
        int NumeratorEndDateID,
        string NumeratorDateColumnForAverage,
        bool DenominatorIsAPlan,
        bool DenominatorIsAnAverage,
        int DenominatorStartDateID,
        int DenominatorEndDateID,
        string DenominatorDateColumnForAverage,                                   
        SqlString SpecialAggregation
    )
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)
)
RETURNS [float] WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [EMMACustomCode].[UserDefinedFunctions].[udfGetCellValueCLR]
GO