从SSIS数据流调用存储过程



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

在长:我有许多表要从一个数据库提取、转换和加载到另一个数据库。几乎所有的表格都需要一个转换,即固定国家代码(从3个字母到2个字母)。因此,我的想法如下:对于每一行:调用存储过程,传递错误的国家/地区代码,用正确的代码(存储过程的输出)替换错误的代码

至少有两种解决方案:

  • Look Up组件:在预先模式中配置它,并确保SProc的最后一句是返回良好国家/地区代码的Select语句(例如Select@good_country_code)
  • 使用OLEDB命令

后者(OLEDB命令)实际上非常简单,您需要使用进行配置

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

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

不,在本机中没有一个组件可以处理这个问题。你可以用脚本组件来完成它,但你不想这样做

您所描述的是查找。数据流任务有一个查找组件,但您会得到更好的服务,尤其是对于像Countrys这样的有限值列表,可以将您的查询推送到该组件中。

从dbo中选择T.Country3,T.Country2。表T;

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

尝试使用存储过程的一大缺点是效率。默认的"查找"将缓存所有这些值。对于脚本版本,假设有10k行通过,全部使用CAN。这相当于对存储过程的10k次调用,结果永远不会改变。

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

可以。您需要使用两个执行SQL任务来完成这项工作。

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

这应该行得通。只选择传递到存储过程所需的列。

编辑

对于另一个答案,性能将成为一个问题。也许与其让存储过程生成输出,不如更改存储过程来为您进行更新。

最新更新