我的工作地点从许多不同的客户端接收管道分隔的文件集,我们使用Visual Studio Integration Services项目将这些文件导入到我们的MS SQL 2008 R2服务器中的表中以供以后处理-特别是对于包含平面文件源的数据流任务, OLE DB目标步骤。每个数据流任务都有专门映射到我们表中列的列,但是来自任何客户端的任何文件中添加列的机会都相对较高(而且我们很少警告会发生更改),随着我目前需要...
我们正在迅速获得越来越多的网站,而我迫切需要找到一种自动化的方法。如果我们可以依靠所考虑的更改,则VS项目可以很容易地实现自动化,但是到目前为止,这需要一个手动过程来确保我们正确加载所有数据。我已经考虑过但无法执行的事情...
使用XML解析器-结合上述python脚本的输出-将新的列映射附加到VS Package.dtsx.xml中的源/目标对象。当我找不到有关为新的列映射创建有效的“ DTS:DTSID”的更多信息时,我走到了尽头,并且每当我对其进行编辑时,文件都将损坏。这似乎也是一个非常不稳定的选择
如果平面文件具有新的未映射的列,则在Visual Studio中查找任何内置事件处理程序以引发错误-我可以以此作为解决方案,因为我们可以放心地安排导入项目自动运行,只担心更改失败项目的映射。我可以找到执行此操作的内置功能。我还知道我可以使用类似于上面提到的python脚本的方式执行此操作,如果存在差异,该脚本将失败,但是由于文件命名约定以及有50多个客户端具有以下事实,因此实现起来非常繁琐
我愿意接受任何类型的解决方案,即使这只是一个主意。因为这是我关于堆栈溢出的第一个问题,所以我对这个问题的回答不佳表示歉意,并要求反馈该问题是否可以得到改善。在此先感谢那些花时间阅读的内容!
编辑: @Larnu表示,在文件中找到无法识别的列时,默认情况下,SSIS会引发错误。但是,这在我们的Visual Studio Integration Services项目中目前还没有发生,并且我们的团队肯定会在此时拒绝将所有程序包转换为SSIS。如果有人能够提供有关如何确保在VS中有新列的情况下该包将失败的信息,那将是很棒的。如果这不可能,那么我可能不得不遵循@Dave Cullum所说的艰难道路,尽管我认为我为此没有得到足够的报酬!
此外,与客户进行交谈也已被证明是不可能的-添加列始终是胡扯!
答案 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,添加条件箭头并比较数字。如果它们相等,则继续您的过程。如果它们不相等,则继续发送电子邮件(或其他某种类型的通知。