回到2000年,我使用SQL Server DTS包进行了一些ETL开发。我开始使用设计器来创建包,但最终使用SQLDMO(数据库管理对象)库来动态生成包。在较高级别,生成的包将读取输入文件并将数据传输到临时表。任何不符合预期列数据类型的记录都将作为错误记录和错误消息记录而被删除,以记录记录验证失败的原因。这段代码一般写成一次。
为实现此目的,首先将数据从平面CSV布局源文件DTS转换为“无类型”dest表,其中表中的列与输入文件中的列匹配,但列都定义为varchar(255)。目的是首先将原始数据放入一个表中,然后可以对非类型化的表运行动态生成的SQL,以识别我们知道不会转换为预期数据类型的数据。错误类型或长度的记录将自动被踢出到与输入文件相同布局的错误表。然后,公共处理库将动态创建一个DTS包,将剩余的记录传输到“类型化”表中,其中所有列现在都是预期的类型,而不仅仅是varchar。所有这些表都是在运行时动态创建的,所有这些都基于预期文件布局的定义。
在初始阶段之后还有更多,但是将数据导入数据库并识别“坏”数据并记录每条记录错误的原因现在再次成为新系统的焦点,这次使用SSIS包。我想在2000年使用SQLMO生成SSIS包并创建一个公共库来使用.NET来处理这个过程,但我想知道其他人在做什么可能会更好。
我个人对工具的偏好倾向于不使用设计师使用可视化方法开发SSIS包。就个人而言,我觉得我拥有最强大的控制力和最好的开发环境,通过使用.NET创建一个可重用的库来抽象整个过程并利用文件系统,SSIS和SQL服务,同时拥有丰富的开发语言。
我发现将文件定义放在表中可以获得各种各样的好处。例如,我决定每个文件定义都有一个标准头,它将唯一地标识应该使用哪种文件格式来解析它。然后我编写了一个编辑器,它可以在网格中显示文件的内容,并允许动态编辑或动态生成DTS包,将数据传输到表中,以允许作为独立工具对数据进行查询。此外,我生成了Word文档,将文件布局显示为文档,并创建了可供标准工具用于以指定格式提取数据的库,以便保证使用它的源系统以正确的格式提供数据。
所以,最后,我的问题:
答案 0 :(得分:3)
在处理错误的提取数据方面没有“银弹”,我怀疑只有一个实践如何去做。 通常以下是从外部源导入数据时可用的选项(基本上是“提取”):
只要您的实施可以支持这三种方案并允许用户选择您或多或少涵盖所有可能的应用程序。