【发布时间】:2014-04-02 18:11:06
【问题描述】:
我正在制作一个 SSIS 包,其中我将多个 Excel 文件传输到一个唯一的 Excel 文件中。
问题在于输入文件可能具有不同的结构(某些列可能不存在)。
我的 SSIS 结构是这样的:
- 一个 foreach 容器,一个接一个地获取每个文件
- 一个显示窗口窗体的脚本,允许我在变量中输入我的列的默认值
- 我的数据流任务
在我的数据流任务中,我想从 Excel 文件中获取值并将它们放入目标文件。 如果该列不存在,我希望数据流使用默认值创建一个新列。
我设法做到了,但我对“如果该列不存在”的事情有疑问。我添加了带有派生列的列,但是他如何首先检查源文件中是否不存在该列。我不想每次都输入默认值。如果该列存在,我想使用它而不是默认值。
感谢您的回答,
【问题讨论】:
-
您的意思是“某些列可能不存在”吗?而不是“某些行可能不存在”。请注意,如果您针对具有 X 列的 Excel 文件定义连接,并且随后需要读取 Y 列,则您的包将不起作用。你能确认源文件肯定是 XLSX/XLS 而不是 CSV 吗?
-
谢谢,那是列而不是行。我确认该文件是 xls 文件。我可以设置最小数据并收集 4 列并收集剩余的列(如果它们的名称合适)而不是等待 10 列广告管理丢失的列?
-
问题出在包中的 excel 源代码中。如果您针对 4 列 Excel 文件定义它并且您的循环尝试加载 10 列文件,它将失败 - 试试看。我这样做的方法是尝试事先计算出文件中有多少列并分支到适当的数据流。你知道你有多少种组合吗?是否只有两种类型的文件?
-
没有精确的文件类型。有些人会多一些,有些人会少一些。他们拥有的越多越好,但他们只能填写 3 个必填列,其他列需要按默认值填写。在其他情况下,我会有一些我不关心的列,但这不是问题。我读到也许脚本组件可以处理它,但我不熟悉使用脚本访问文件
-
您可以尝试按照以下方式选择所需的列:sqlserversolutions.blogspot.com.au/2009/02/…。这可以保证您的 Excel 源返回一致的列。您可能必须采用 try/catch 方法来获取所需的列,即数据流具有包含所有列的选择。如果失败,请尝试使用较少列的下一个选择。是的,您可以使用脚本,但您也可以在 SSIS 外部执行。
标签: sql sql-server excel ssis dataflow