Ach*_*him 7 c# sqlclr sql-server-2008
我必须在数据上实现一个算法(有充分的理由)存储在SQL服务器中.该算法不适合SQL,因此我想将其实现为CLR函数或过程.这就是我想要做的事情:
执行几个查询(通常是20-50,但最多100-200),这些查询都具有该表单select a,b,... from some_table order by xyz.有一个适合该查询的索引,因此结果应该或多或少可用而无需任何计算.
逐步消耗结果.确切的步进取决于结果,因此它不是完全可预测的.
通过逐步调整结果来汇总一些结果.我只会消耗结果的第一部分,但无法预测我需要多少.停止标准取决于算法内的某个阈值.
我的想法是打开几个SqlDataReader,但我有两个问题:
每个连接只能有一个SqlDataReader,在CLR方法中我只有一个连接 - 据我所知.
我不知道如何告诉SqlDataReader如何以块的形式读取数据.我找不到SqlDataReader应该如何表现的文档.据我所知,它正在准备整个结果集,并将整个结果加载到内存中.即使我只消耗它的一小部分.
任何提示如何解决这个问题作为CLR方法?或者是否有更低级别的SQL服务器接口,更适合我的问题?
更新:我应该更明确地提出两点:
我在谈论大数据集,因此查询可能会产生1 mio记录,但我的算法只会消耗前100-200个记录.但正如我之前所说:我事先并不知道确切的数字.
我知道SQL可能不是这种算法的最佳选择.但由于其他限制,它必须是SQL服务器.所以我正在寻找最好的解决方案.
SqlDataReader不读取整个数据集,您将其与Dataset类混淆。它.Read()在调用方法时逐行读取。如果客户端不使用结果集,服务器将挂起查询执行,因为它没有空间将输出写入(所选行)。随着客户端消耗更多行(正在调用 SqlDataReader.Read),执行将恢复。甚至还有一个特殊的命令行为标志SequentialAccess,指示 ADO.Net 不要在内存中预加载整行,这对于以流式方式访问大型 BLOB 列非常有用(请参阅通过 ASP.Net MVC 从 SQL Server 下载和上传图像以了解一个实际的例子)。
当MARS处于活动状态时,您可以在单个连接上激活多个活动结果集 (SqlDataReader) 。但是,MARS 与 SQLCLR 上下文连接不兼容。
因此,您可以创建一个 CLR流 TVF来执行您在 CLR 中需要的一些操作,但前提是您只有一个 SQL 查询源。多个查询需要您放弃上下文连接并使用 istead 一个完全成熟的连接,即。在环回中连接回同一个实例,这将允许 MARS 并因此消耗多个结果集。但是环回有其自身的问题,因为它打破了您从上下文连接中获得的事务边界。特别是对于环回连接,您的 TVF 将无法读取调用 TVF 的同一事务所做的更改,因为在不同的连接上是不同的事务。