SQLCLR用户定义聚合(UDA)中的数据访问

时间:2016-04-04 21:29:06

标签: sql sql-server sql-server-2014 sqlclr

我理解SQLCLR聚合的限制,因为它与数据访问有关。话虽如此,有没有办法(解决方法)将结果存储到表中?它必须在SQLCLR聚合中。

2 个答案:

答案 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;

基本上,这与存储任何内置聚合函数的结果相同,例如:SUMMINMAX,{{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权限。