VS Integration Services:从平面文件源到OLE DB目标-检测文件中的新数据列,向表中添加列,自动



我的工作场所从许多不同的客户端接收管道分隔的文件集,我们使用Visual Studio Integration Services项目将这些文件导入到MS SQL 2008 R2服务器中的表中,以便稍后处理,特别是使用包含平面文件源到OLE DB目标步骤的数据流任务。每个数据流任务都有专门映射到表中列的列,但从任何客户端在任何文件中添加列的可能性都相对较高(而且我们很少被警告会有更改(,这变得很乏味,因为我目前需要…

  1. 运行一个python脚本,该脚本使用pyodbc获取目标表中包含的列,并将它们与源文件进行比较,以确定列中是否存在差异
  2. 执行必要的SQL以将列添加到目标表
  3. 打开相应的VS解决方案,刷新平面文件源中具有新列的列,并手动将每个新列映射到OLE DB目标中新创建的列

我们很快就有越来越多的网站需要我来做这件事,我迫切需要找到一种自动化的方法。如果我们可以依赖于所考虑的更改,VS项目可以很容易地实现自动化,但到目前为止,这需要一个手动过程来确保我们正确加载所有数据。我想过但无法执行的事情。。。

  1. 使用XML解析器-结合上面提到的python脚本的输出-将新的列映射附加到VS Package.dtsx.XML中的源/目标对象。当我找不到关于为新列映射创建有效的"DTS:DTSID"的更多信息时,我陷入了死胡同,每当我编辑它时,文件就会损坏。这似乎也是一个非常不稳定的选择

  2. 如果平面文件有一个新的、未映射的列,请在Visual Studio中找到任何内置的事件处理程序来引发错误-作为一种解决方案,我会很满意,因为我们可以放心地安排导入项目自动运行,只需担心更改失败项目的映射。我可以找到一个可以做到这一点的内置功能。我也知道,如果存在差异,我可以使用类似于上面提到的python脚本来实现这一点,但由于文件命名约定以及有50多个客户端正在进行更多操作,这将非常乏味。

我对任何类型的解决方案都持开放态度,即使这只是一个想法。由于这是我在Stack Overflow上的第一个问题,如果问题问得不好,我深表歉意,如果问题可以改进,请寻求反馈。提前感谢那些花时间阅读的人!

编辑:@Larnu指出,当在文件中发现无法识别的列时,SSIS默认情况下会抛出错误。然而,我们的Visual Studio Integration Services项目目前还没有出现这种情况,我们的团队现在肯定会抵制将所有包转换为SSIS。如果有人能深入了解如何确保在VS中出现新列时包会失败,那将是一件非常棒的事情。如果这不可能,我可能不得不走@Dave Cullum提到的艰难路线,尽管我认为我的报酬不够!

此外,事实证明,向客户讲道理是不可能的——增加专栏总是一场掷骰子游戏!

使用脚本任务,您可以读取文件并记录一行中有多少管道:

using (System.IO.StreamReader sr = new System.IO.StreamReader(path))
{
string line = sr.ReadLine();
int ColumnCount = line.Length - line.Replace("|", "").Length +1;
}

我想你知道如何将其设置为变量。

现在添加一个执行SQL并将结果存储为另一个变量:

Select Count(*) 
from INFORMATION_SCHEMA.columns 
where TABLE_NAME = [your destination table] 

现在退出execute SQL,添加一个条件箭头并比较数字。如果他们是平等的,继续你的过程。如果他们不平等,那么继续发送电子邮件(或其他类型的通知。

最新更新