我会说UDAGG 规范是 CLR 用户定义聚合的文档要求(链接到 2014 版)
它说明了您需要做什么。您的错误表明问题出在Accumulate
方法上,因此我们检查要求:
input_type应该是托管 SQL Server 数据类型,它等效于由 CREATE AGGREGATE 语句中的 input_sqltype 指定的本机 SQL Server数据类型。
当然,您的答案包含有关您出错的具体细节的更多细节,我无法评论,因为您没有在问题中显示 C# 代码。
正如您的回答所暗示的那样CREATE AGGREGATE
,“在和之间提供的位”没有正式名称。EXTERNAL
的完整语法CREATE AGGREGATE
描述为:
CREATE AGGREGATE [ schema_name . ] aggregate_name
(@param_name <input_sqltype>
[ ,...n ] )
RETURNS <return_sqltype>
EXTERNAL NAME assembly_name [ .class_name ]
<input_sqltype> ::=
system_scalar_type | { [ udt_schema_name. ] udt_type_name }
<return_sqltype> ::=
system_scalar_type | { [ udt_schema_name. ] udt_type_name }
再举一个例子,这个聚合:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)]
public struct SqlAggregate1
{
public void Accumulate(SqlString Value)
{
// Put your code here
}
public void Merge (SqlAggregate1 Group)
{
// Put your code here
}
public SqlString Terminate ()
{
// Put your code here
return new SqlString (string.Empty);
}
// This is a place-holder member field
public int _var1;
}
使用此 SQL:
CREATE AGGREGATE [dbo].[SqlAggregate1](@Value NVARCHAR (MAX))
RETURNS NVARCHAR (MAX)
EXTERNAL NAME [Database2].[SqlAggregate1];
产生错误:
消息 6558,级别 16,状态 1,第 1 行 CREATE AGGREGATE 失败,因为类型“SqlAggregate1”由于方法“Init”不符合 UDAGG 规范。
Accumulate
尽管and和“在andTerminate
之间提供的位”的定义之间存在绝对的一致性。CREATE AGGREGATE
EXTERNAL NAME