1

我有一个 CLR 函数,它返回带有随机数据的“n”行。例如,要准备一个包含 100 行测试数据的空表,我可以编写

INSERT INTO CustomerInfo(FirstName, LastName, City...)
     SELECT FirstName, LastName, City... 
     FROM MyCLRFunction(100)

这将返回 100 个带有随机信息的“客户”。如果我用非常高的数字调用它,我会收到内存不足错误,因为整个数据集是在发送给调用者之前创建的。当然,我可以使用 SqlPipe 对象并在创建行时发送行,但据我所知,您只能将这种方法与 SqlProcedures 一起使用。这意味着我不能使用 INSERT INTO 方法,因为你不能从存储的过程中选择。

我希望我在这里遗漏了一些东西,并且实际上可以将 SqlPipe.SendResultRow 与一个函数结合起来,或者有人有一个聪明的解决方法。

可以将其保留为 proc,并让该 proc 将这些记录放入会话范围的临时表中。然后调用者可以在他们的 SELECT 子句中使用该表,但我希望最好的世界,我可以为调用者提供一个很好、干净的语法,并且仍然可以扩展到大量记录。

坦率地说,最初的解决方案可能“足够好”,因为我们可能永远不会想要这么多的测试数据,即使我们想要,我们也可以多次运行 INSERT 语句。但我试图全面了解 CLR 集成,并想知道如果类似的用例出现在业务场景中,我将如何解决这个问题。

4

2 回答 2

0

研究流式 SQLCLR 表值函数 - http://msdn.microsoft.com/en-us/library/ms131103.aspx

您基本上将一个返回IEnumerable到 SQL Server 并让它使用它,因此不需要在返回之前实现所有结果。

于 2013-05-01T15:38:36.500 回答
0

我找到了解决方案。解决方案不是返回整个项目列表,而是使用

yield mything;

这会导致为每个处理的实体触发 FillRowMethod,从而有效地将结果流式传输回调用方。

很高兴能解决这个问题,但对最终解决方案的简单程度感到有些尴尬。

于 2013-05-01T20:27:07.797 回答