【问题标题】:How to reference Input Columns in SQL Command for OLE DB Destination?如何在 SQL 命令中为 OLE DB 目标引用输入列?
【发布时间】:2020-06-30 13:59:46
【问题描述】:
我有数据流任务。它的最后一步是 OLE DB 目标组件。我的目标是更新现有表。该表具有字段 Id、Query 和其他一些字段。 OLE DB 目标具有输入列 rowId、queryString。我正在尝试使用 DataAccessMode: SQL 命令。但是如果我写类似的东西
UPDATE [queryTable]
SET [Query] = [queryString]
WHERE [Id] = [rowId]
我收到错误“列名 'rowId' 无效”
我想我应该写一些类似 [Input Columns].[rowId] 的东西,但我不太清楚。
【问题讨论】:
标签:
sql-server
ssis
oledbdestination
【解决方案1】:
好吧,您想更新 SSIS 中的现有表。您可以通过两种方式来处理它。
-
创建一个OLE DB Command Transformation 作为最后一步。很简单,对于您的示例,您应该编写类似
UPDATE [queryTable]
SET [Query] = ?
WHERE [Id] = ?
在编辑器的 列映射 选项卡上 - 将第一个参数映射到 queryString 字段,将第二个参数映射到 rowId。
简单、容易做,但性能不佳 - 每一行都将在其自己的 SQL 事务中处理。
-
在 SQL 中创建一个缓冲表,清除它(以防万一),用 OLE DB 目标 将所有更改的行存储在那里。然后在 Data Flow 旁边的步骤中,即 Execute SQL Task,使用一些 SQL 命令(如
)使用缓冲表中的数据更新表
UPDATE [queryTable]
SET [queryTable].[Query] = [buffer].[queryString]
FROM [queryTable]
INNER JOIN [buffer] ON [queryTable].[Id] = [buffer].[Id]
嗯,它会更快,因为所有修改都将在一个事务中进行。但是 - SSIS 包会更复杂,您必须创建一个额外的表。