2011-05-28 74 views
6

问题:目前我们有许多存储过程(很长时间最多10,000行),这些存储过程由各种开发人员在过去10年中针对各种需求编写。现在很难管理这些复杂/长期存储的过程(没有适当的文档)。将SQL Server存储过程转换为SSIS包

我们计划将这些存储过程移动到SSIS ETL包中。

有没有人做过这个事情?如果是的话,应该采取什么方法。

欣赏是否有人可以提供关于将存储过程转换为SSIS ETL包的方法的建议。

感谢

+0

将过程转换为SSIS包的最终目标是什么? ETL'ing的存储过程是什么? – 2011-05-28 17:54:18

+0

是存储过程主要是做ETL操作并将数据从1台sql server移动到另一台sql server。 – 2011-05-28 17:55:10

+0

查看几个数据集成选项,如:SSIS,Service Broker,StreamInsight ....努力如何将10,000行存储过程转换为多个可管理的包 – 2011-05-28 17:56:07

回答

5

我这样做过,什么行之有效我的团队是逐步重构,从原来的来源,然后迭代重构工作。

第一步是尝试将存储过程逻辑模块化为我们链接在一起的执行SQL任务。每项任务都经过测试和批准,然后我们将整合并确保新流程与传统流程的结果相匹配。

在此之后,我们可以将整个团队中的各个执行SQL任务分开,并对我们是否可以将执行SQL任务中的SQL进一步重构为本机SSIS任务的分析进行负载平衡。

每个重构都经过单独的单元测试,然后进行集成测试,以确保整个过程输出仍然像传统过程一样。

+0

谢谢arcain的建议。查询 - 可以说我们将sp模块化为执行SQL任务,然后链接在一起。如果我无法进一步将它们重构为本地SSIS任务,ETL将会提供什么样的好处。这样我所做的就是从存储过程中取出sql语句,并将它们放入执行SQL任务中。 – 2011-05-28 19:46:09

+0

@Lokesh这只是第一步。在将单片处理程序分解为任务时,几乎总是(至少对我来说)显然可以将任务(或一系列任务)转换为本地SSIS操作。如果你不能进一步减少一个SQL任务到一个SSIS任务,那么你就完成了(当时)。我的哲学[与Spolsky一致](http://www.joelonsoftware.com/articles/fog0000000069.html)因为你的遗留代码是有效的,重构它而不是重写是一种很好的做法。这种方法可以让您很快看到结果,并强调测试零件和整体。 – arcain 2011-05-28 21:17:59

3

我建议以下步骤:

  1. 分析存储过程来确定的来源和目的地列表。例如:如果存储过程dbo.TransferOrders将数据从表dbo.Order移动到dbo.OrderHistory。那么你的来源将是dbo.Order和目的地将是dbo.OrderHistory

  2. 在列出源和目标后,尝试根据您的首选项按源/目标对存储过程进行分组。

  3. 试着找出在存储过程中是否发生了任何数据转换。 SSIS中有很好的数据转换任务。您可以评估这些功能并将其中一些功能从存储过程移至SSIS。由于SSIS是一种工作流程类型,我觉得理解包内部的内容比浏览许多代码行来理解功能更容易。但是,那只是我。偏好因人而异。

  4. 尝试识别存储过程中的依赖关系并准备层次结构。这将有助于按照适当的顺序将任务放入包中。

  5. 如果您有填充5个不同表的dbo.Table1表。我会建议让他们在一个单一的包。即使这些数据由5个不同的存储过程执行,您也不需要购买5个包。不过,这又取决于您的业务场景。

  6. SSIS项目解决方案可以在其中包含多个软件包并重新使用数据源。您可以使用Control Flow任务中提供的Execute SQL task来运行现有的查询,但我建议您也查看一下SSIS中可用的一些很好的转换任务。我已经在我的项目中使用过它们,它们在ETL操作中运行良好。

这些步骤可以通过一次查看一个存储过程来完成。你不必一次完成所有这些。

请看看我在其他堆栈溢出问题中给出的一些示例。这些应该可以帮助您了解使用SSIS可以实现的功能。

Copying data from one SQL table to another

Logging feature available in SSIS

Loading a flat file with 1 million rows into SQL tables using SSIS

希望有所帮助。