从SSIS Dataflow调用存储过程

时间:2015-02-24 20:37:45

标签: sql-server stored-procedures ssis

简而言之: 我可以调用在数据流中具有输出参数的存储过程吗?

长期: 我有很多表可以从一个db提取,转换和加载到另一个db。 几乎所有的表都需要一个修改国家代码的转换(从3个字母到2个字母)。所以我的想法如下: 对于每一行:调用存储过程,传递错误的国家代码,用正确的代码替换错误的代码(存储过程的输出)

3 个答案:

答案 0 :(得分:4)

至少有两种解决方案:

  • 查找组件:在高级模式下配置它并确保SProc的最后一句是返回良好国家/地区代码的Select语句(例如SELECT @good_country_code)
  • 使用OLEDB命令

后者(OLEDB Command)实际上非常简单,您需要配置它:

EXEC ? = dbo.StoredProc @param1 = ?, @param2 = ?

因此,@ RETURN_VALUE将出现在可用目标列上,然后您可以映射到管道中的现有列。请记住在OLEDB组件之前使用派生列组件创建新的管道字段/列(例如Good_Country_Code),并且您将有机会同时拥有这两个值,或者在OLEDB命令之后使用另一个派生列组件替换错误的组件。

答案 1 :(得分:2)

不,原则上没有一个组件可以处理它。您可以使用脚本组件完成它,但您不想这样做。

你所描述的是一个查找。数据流任务有一个查找组件,但您会得到更好的服务,特别是对于像您所查询到组件的国家这样的有限值列表。

SELECT T.Country3,T.Country2 FROM dbo.Table T;

然后拖动SourceCountry列并匹配Country3。检查Country2,对于匹配的所有行,您将获得2个字母的缩写。

尝试使用存储过程的一大缺点是效率。默认Lookup将缓存所有这些值。使用脚本版本,假设您有10k行,所有行都使用CAN。这是对存储过程的10k调用,结果永远不会改变。

您确实支付了启动成本,因为默认的查找模式是完全缓存,这意味着它将运行您的查询并将所有这些值保持为本地。这对您的数据集很有用:最多1000个国家/地区,每行5或10个字节。没什么。

答案 2 :(得分:0)

是的,你可以。您将要使用几个执行SQL任务来执行此操作。

  1. 使用执行SQL任务收集Wrong_Country_Code s的结果集。
  2. 添加ForEach容器作为上一个执行SQL任务的后继容器。将结果集传递给此容器。
  3. 在ForEach容器中,您将使用另一个执行SQL任务来调用您的sproc,使用每一行(例如Wrong_Country_Code)作为变量参数。
  4. 那应该有用。只选择传递给存储过程所需的列。

    修改

    对另一个答案的承认,表现将成为一个问题。也许不是让存储过程产生输出,而是改变sproc来为你做更新。