0

我需要为现有的 MS SSDT 项目创建一个数据流,将平面 CSV 文件导入现有的数据库表。到现在为止还挺好。

但是,我想拒绝列“代码”与已存储在数据库中的值匹配的所有条目。更好的是,如果可能的话,在“代码”列与数据库中的条目匹配的情况下,我想更新“描述”列。重要的是在任何情况下都不应创建重复的代码条目。

谢谢

4

1 回答 1

0

好的,当我发现它时,我认为其他人可能会发现它很有用:

简短的回答是需要在数据源和目标之间进行查找。这种“查找”将在需要更新的匹配项和需要直接进入新表行的新值之间进行过滤(见图)。 带查找的 SSDT

与数据库匹配并需要更新到描述的值需要输入“OLE DB 命令”。

在“查找”组件中,我们需要执行以下操作:

  1. 转到常规选项卡并选择将行重定向到不匹配的输出
  2. 转到连接选项卡并插入以下 SQL:

    SELECT id, code FROM tableName
    
  3. 进入“列”选项卡并检查“可用查找列”表中的“id”列。还要检查“代码”列并将其拖到相应的“可用输入列”对应项以将它们相互映射,以便查找可以比较它们。-- 此时如果遇到映射导致的错误,尝试将setep 2中的代码替换为:

    SELECT id, CAST(code AS nvarchar(50)) AS code FROM tableName
    
  4. 在错误输出中,确保“查找匹配输出”下的 id 有“复制列”的描述

现在我们需要配置“OLE DB 命令”组件:

  1. 转到“连接管理器”选项卡并确保组件已连接到所需的数据库
  2. 转到“组件属性”并将以下代码添加到“SQLCommand”属性:

    UPDATE tableName SET description = ? WHERE id = ?
    

    注意“?”。它应该在那里表明必须将参数添加到“列映射”选项卡,不要替换它们。

  3. 最后进入“Column Mappings”选项卡并将Param_0(第一个?)映射到“description”列,将“Param_1”映射到“id”列。不需要对“代码”或 db 表可能包含的任何其他列执行任何操作。

现在为自己完成一项任务给自己点赞,在 SQL 中,这通常是一行代码,大约需要 10 个耗时的步骤;-)

于 2013-02-22T10:48:51.440 回答