2

当我运行 T-SQL 命令时,我创建了一个 SQLCLR 程序集并添加了它:

CREATE AGGREGATE Concat (@input nvarchar(max))
RETURNS nvarchar(max)
EXTERNAL NAME Sql_ClrAggregates.Concatenate;

我得到错误:

消息 6558,级别 16,状态 1,第 1 行
CREATE AGGREGATE 失败,因为类型“连接”由于方法“累积”不符合 UDAGG 规范。

什么是 UDAGG 规范?

4

2 回答 2

2

我会说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 AGGREGATEEXTERNAL NAME

于 2015-06-26T08:39:04.163 回答
1

UDAGG 规范部分提到了和之间提供的位CREATE AGGREGATEEXTERNAL NAME

Concat (@input nvarchar(max)) RETURNS nvarchar(max)

检查这是否与程序集中的方法匹配,在 c# 中,这将是

public void Accumulate(SqlString Value)
{ ... }

终止函数返回结果:

public SqlString Terminate()
{ ... }

如果您添加了不符合要求但会特别提及该字段的公共字段、方法等,您将收到类似的错误。

于 2015-06-26T08:29:58.780 回答