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

时间:2018-12-13 17:37:17

标签: python sql sql-server visual-studio ssis

我的工作地点从许多不同的客户端接收管道分隔的文件集,我们使用Visual Studio Integration Services项目将这些文件导入到我们的MS SQL 2008 R2服务器中的表中以供以后处理-特别是对于包含平面文件源的数据流任务, OLE DB目标步骤。每个数据流任务都有专门映射到我们表中列的列,但是来自任何客户端的任何文件中添加列的机会都相对较高(而且我们很少警告会发生更改),随着我目前需要...

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

我们正在迅速获得越来越多的网站,而我迫切需要找到一种自动化的方法。如果我们可以依靠所考虑的更改,则VS项目可以很容易地实现自动化,但是到目前为止,这需要一个手动过程来确保我们正确加载所有数据。我已经考虑过但无法执行的事情...

  1. 使用XML解析器-结合上述python脚本的输出-将新的列映射附加到VS Package.dtsx.xml中的源/目标对象。当我找不到有关为新的列映射创建有效的“ DTS:DTSID”的更多信息时,我走到了尽头,并且每当我对其进行编辑时,文件都将损坏。这似乎也是一个非常不稳定的选择

  2. 如果平面文件具有新的未映射的列,则在Visual Studio中查找任何内置事件处理程序以引发错误-我可以以此作为解决方案,因为我们可以放心地安排导入项目自动运行,只担心更改失败项目的映射。我可以找到执行此操作的内置功能。我还知道我可以使用类似于上面提到的python脚本的方式执行此操作,如果存在差异,该脚本将失败,但是由于文件命名约定以及有50多个客户端具有以下事实,因此实现起来非常繁琐

我愿意接受任何类型的解决方案,即使这只是一个主意。因为这是我关于堆栈溢出的第一个问题,所以我对这个问题的回答不佳表示歉意,并要求反馈该问题是否可以得到改善。在此先感谢那些花时间阅读的内容!

编辑: @Larnu表示,在文件中找到无法识别的列时,默认情况下,SSIS会引发错误。但是,这在我们的Visual Studio Integration Services项目中目前还没有发生,并且我们的团队肯定会在此时拒绝将所有程序包转换为SSIS。如果有人能够提供有关如何确保在VS中有新列的情况下该包将失败的信息,那将是很棒的。如果这不可能,那么我可能不得不遵循@Dave Cullum所说的艰难道路,尽管我认为我为此没有得到足够的报酬!

此外,与客户进行交谈也已被证明是不可能的-添加列始终是胡扯!

1 个答案:

答案 0 :(得分:0)

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

        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] 

现在退出执行SQL,添加条件箭头并比较数字。如果它们相等,则继续您的过程。如果它们不相等,则继续发送电子邮件(或其他某种类型的通知。