我理解SQLCLR聚合的限制,因为它与数据访问有关。话虽如此,有没有办法(解决方法)将结果存储到表中?它必须在SQLCLR聚合中。
答案 0 :(得分:0)
在C#函数中准备好聚合结果之后,为什么不使用C#ADO.NET(用于数据库操作)将这些聚合存储在数据库中。这将在您的SQL CLR函数中,以便您从数据库调用SQL CLR函数一次,它将聚合存储在某个表中。
答案 1 :(得分:0)
为什么需要将聚合结果存储在用户定义聚合(UDA)中的表中?鉴于您可以使用普通T-SQL将结果存储到表中,这几乎没有任何意义:
INSERT INTO SchemaName.TableName (Col1, Col2, ...)
SELECT tab.SomeColumn, SchemaName.CustomAggregate(tab.OtherColumn)
FROM SchemaName.TableName tab
GROUP BY tab.SomeColumn;
基本上,这与存储任何内置聚合函数的结果相同,例如:SUM
,MIN
,MAX
,{{1} },COUNT
等
但是,如果 需要出于某种奇怪的原因而这样做,只需在{{1}中使用外部连接(即不 AVG
) UDA的方法。
请注意,执行此类数据访问的要求是连接不尝试在当前事务上下文中登记(并且登记是默认行为)。这意味着您的连接字符串需要包含以下关键字和值:Context Connection = true;
。这确实有效,因为我在Terminate()
方法中成功使用了以下内容,在添加Enlist = false;
之前,我也得到了" 在此上下文中不允许数据访问。上下文是未使用DataAccessKind.Read或SystemDataAccessKind.Read标记的函数或方法,是从表值函数的FillRow方法获取数据的回调,或者是UDT验证方法。"错误。
Terminate()
请注意,进行常规/外部连接需要将程序集标记为Enlist=false;
。但是, not 需要将数据库设置为using (SqlConnection _Connection =
new SqlConnection("Trusted_Connection=true; Enlist=false;"))
{
using (SqlCommand _Command = _Connection.CreateCommand())
{
_Command.CommandText = "SELECT TOP 1 * FROM sys.objects;";
_Connection.Open();
_Command.ExecuteNonQuery();
}
}
:您只需对程序集进行签名,在{DLL} /程序集中EXTERNAL_ACCESS
创建一个非对称密钥,创建一个登录名从该非对称密钥,最后TRUSTWORTHY ON
登录master
权限。