0

我正在运行动态查询,最初通常会返回 HUGE (300MB - 1GB) 结果集。后来,它不应该这么大(虽然不确定),因为我将使用增量加载。然后将这些结果集加载到 C# 数据表中。脚本循环遍历这些行,然后生成查询(存储在 SSIS 变量中)以将它们加载到适当的目标列(由其他脚本确定)。

对于小型结果集,我的包运行正常。但是,对于大的,它只是由于内存不足错误而失败。我该如何解决这个问题?你能提出一些策略吗?我想我可以一次获取较小部分的数据,然后加载到目标中。不知道该怎么做。有这个食谱吗?

简要介绍该过程的工作原理 -

Execute SQL: Get big ResultSet > Script:RowReader: Read each row 
and generate a String SQL like "Insert INTO TableABC VALUES" + {all 
columns of 1 row here}. Then, concatenate SQL to a String destinationInsert > 
Execute SQL: execute SQL inside String destinationInsert. 

ETL 过程完成。这有帮助吗?

4

1 回答 1

4

由于 T-SQL 是一种合适的编程语言,因此您可以用它做很多事情。如果您提到的“脚本”不涉及繁重的 I/O 或远程通信,则可以用 SQL 重写。

数据通常是逐行处理的,这可以通过一条语句(更新...)来完成。所以无论如何你都可以在服务器中做你想做的事。

但是让我们假设脚本太复杂而无法用 SQL 进行编码。好吧,然后用 C# 编码,将程序集添加到 SQL-Server 中。您的 C# 代码可以作为 CLR 函数访问,因此您可以在不占用内存的情况下完成所有操作。编辑:糟糕,您使用的是 SQL-2005。不能 100% 确定是否可以添加 .NET 程序集...正如 Gary Walker 指出的那样,SQL 2005 支持 CLR。​​谢谢,Gary。

如果您与我们分享您的脚本或至少它的基本功能,我相信我们可以为您找到一个快速简便的解决方案。

于 2013-10-29T20:05:53.067 回答