在SSIS中如何访问运行OLE DB命令的结果?

问题描述 投票:0回答:4

我在 Visual Studio 2010 中使用 SSIS。我的包如下所示: OLE DB 源 -> 多播 -> 7 个 OLE DB 命令

上述七个 OLE DB 命令中的第六个包含:

SELECT r.DeviceID 
FROM   hub.ResolveDeviceInstanceToDevice r 
WHERE  r.DeviceInstanceID = ?
       AND r.DatasetID = ?

我希望在第七个 OLE DB 命令中使用返回的 DeviceID。我可以这样做吗?如何?如果不是我该怎么办?

我已将所有 7 个 OLE DB 命令放在一个多播下,因为其中几个命令使用来自 OLE DB 源的相同输出。

我选择不使用存储过程来执行此操作,因为更喜欢通过 ETL 来执行此操作。但如果这太复杂,我会考虑转向存储过程。

database ssis command etl ole
4个回答
5
投票

我知道这是一个老问题,但我在搜索类似问题时发现了它。对于像 Kyle 回答的那样,Lookup 可能是您给出的语句的更好解决方案,但是您可以通过向 SQL 语句添加参数来完成您所要求的操作。

SELECT ?=r.DeviceID 
FROM   hub.ResolveDeviceInstanceToDevice r 
WHERE  r.DeviceInstanceID = ?
   AND r.DatasetID = ?

因此第一个问号将是 param0 并将是查询的结果列/字段。


3
投票

您不应该使用 OLE DB 命令执行此操作。相反,您应该使用查找任务来实现此目的。

  1. 设置您的查找与您正在运行命令的数据库的连接。
  2. 将其查询设置为

    选择 r.DeviceID、r.DeviceInstanceID、r.DataSetID 从 hub.ResolveDeviceInstanceToDevice r

  3. 在列中,将源的 DeviceInstanceID 和 DataSetID 输入加入到相应的查找列中。

  4. 将 DeviceID 添加为输出列。

现在您可以在另一个 OLE DB 命令中使用该值。


1
投票

我认为使用

select
是不可能的。有了存储过程,你就可以做到

exec ? = GetDeviceId ?, ?


0
投票

也许您可以通过将“OLE DB Command 6”的

DeviceID
输出写入脚本组件来完成此操作。在该脚本组件中,将输入写入新的目标。您应该将该目标设置为临时表。删除“OLE DB Command 7”并将其代码作为不带参数的纯粹 SQL 代码放入新的脚本组件中,以便您使用该临时表中的查找连接运行
select
查询,就像查找中的其他答案所说的那样也可以,但是是在 C# 中的脚本组件中。脚本组件具有输入和输出箭头,可以运行任何 SQL 命令。要了解如何使用绿色箭头输入的输入数据集(“OLE DB Command 6”的输出)填充临时表,请参阅示例 如何从数据源创建并填充临时表无需离开 SSIS 数据流任务即可使用 C# DataTable 的方法吗?.

这一切的技巧在于,写入“OLE DB 目标”没有输出箭头,因此您无法确保下一步是在写入之后。但如果您使用脚本组件执行此操作,您将拥有输入和输出箭头以及您能想到的所有 SQL 功能,这些功能都嵌入在 C# 中。

© www.soinside.com 2019 - 2024. All rights reserved.