我正在运行动态查询,通常最初会返回HUGE(300MB - 1GB)结果集。后来,它不应该是这么大(虽然不确定),因为我将使用delta加载。然后将这些结果集加载到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过程完成。这有帮助吗?
答案 0 :(得分:4)
由于T-SQL是一种适当的编程语言,因此可以使用它做很多事情。如果您提到的“脚本”不涉及繁重的I / O或远程通信,则可以在SQL中重写它。
数据通常是逐行处理的,这可以通过一个语句(UPDATE ...)来完成。所以无论如何你都可以在服务器内做你想做的事。
但我们假设脚本太复杂,无法在SQL中编写代码。好吧,然后在C#中编写代码将程序集添加到SQL-Server中。您的C#代码可以作为CLR功能访问,因此您可以在不中断内存的情况下完成所有操作。编辑:哎呀,你正在使用SQL-2005。不是100%肯定你是否可以添加.NET程序集...正如Gary Walker指出的那样,SQL 2005支持CLR。Thx,Gary。
如果您与我们分享您的脚本或至少其基本功能,我相信我们可以为您找到快速简便的解决方案。