AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 305801
Accepted
user1664043
user1664043
Asked: 2022-01-08 15:22:12 +0800 CST2022-01-08 15:22:12 +0800 CST 2022-01-08 15:22:12 +0800 CST

SSIS 检测顺序重复

  • 772

SSIS/Sql 服务器/Visual Studio 2019。

我有一个很大的 csv 文件,里面有很多不确定的数据。我想做的一件事是至少尝试识别相同的连续行并将重复的行剔除。通过“相同”,我想检查 2 个特定的列值 - 名称和公司。

我有一个看起来应该可以工作的流程(鉴于这是我的第一个 SSIS 包和有限的经验),但没有捕捉到顺序重复。我不知道这是否是因为我没有理解条件拆分表达式语法、脚本组件的工作方式,或者包变量更改应该何时/如何从脚本组件生效。没有人抛出错误,但是文件中连续重复的行不会被发送到“拒绝”滑槽。

我创建了两个包变量(lastName 和 lastCompany),初始化为“”。

该流程有一个平面文件源读入,然后是一个条件拆分,其中包括表达式中的其他子句,

... && !(Name == @[User::lastName] && Company == @[User::lastCompany]) &&

这个想法是任何匹配所有子句的东西都将进入“成功”路径,而未通过任何这些检查的行将进入“拒绝”流程。

“成功”流程的下一件事是脚本组件,它执行一些数据规范化并(至少尝试)更新包变量。我为模板找到了另一篇文章。

public override void PostExecute()
{
    base.PostExecute();

    // I've been trying to debug this and get some output on the VS output window but so far nothing has worked.
    // Trace is not showing up in DbgView, FireInformation and FireWarning didn't show up in any of the windows in VS
    Trace.WriteLine($"Starting: [{Variables.lastName}|{Variables.lastCompany}], Ending: [{lastName}|{lastCompany}]");

    Variables.lastCompany = lastCompany;
    Variables.lastName = lastName;
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    ...
    lastName = Row.Name;
    lastCompany = Row.Company;
}

我错过了什么

  1. 包变量的持久性和脚本组件的更新?
  2. 条件拆分表达式行为?

我的意思是,它看起来应该对我有用,但事实并非如此。

谢谢

sql-server ssis
  • 1 1 个回答
  • 95 Views

1 个回答

  • Voted
  1. Best Answer
    billinkc
    2022-01-09T09:59:32+08:002022-01-09T09:59:32+08:00

    SSIS 变量值只能在管道执行OnPreExecute的阶段和阶段进行修改。OnPostExecute在执行期间,它们是静态的。

    您可以通过使用派生列任务向数据流添加列来验证此行为,并@[User::lastName]在脚本任务之后使用添加变量。您会看到第一行和最后一行之间的值永远不会改变。

    因此,此代码段存在逻辑错误

    (Name == @[User::lastName] && Company == @[User::lastCompany])
    

    所以你会怎么做?

    最大的挑战当然是你有一个 330M 的行文件。

    如果我们只关心顺序重复,那么您设计的脚本任务几乎是正确的,除了尝试分配给 SSIS 变量。相反,您需要将列添加到数据流中,以便后续的条件拆分可以做出合乎逻辑的选择。对于正常工作,我可以将 lastName 和 lastCompany 添加到数据缓冲区。但是,鉴于您将要处理大量数据,您需要争取获得的每一块内存。我将改为在您的脚本任务中执行比较逻辑,并简单地发出一个布尔值,指示该行是否与前一行重复。

    我会有一个脚本任务,充当文件源之后的转换。它将作为只读输入列Company,Name并将在输出中添加一个新列,称为IsDuplicate

    using System;
    using System.Data;
    using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
    using Microsoft.SqlServer.Dts.Runtime.Wrapper;
    
    [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
    public class ScriptMain : UserComponent
    {
        // member variables to keep track of previous row data
        private string lastName;
        private string lastCompany;
    
        public override void PreExecute()
        {
            base.PreExecute();
            // initialize our variables
            this.lastCompany = "";
            this.lastName = "";
        }
    
        public override void Input0_ProcessInputRow(Input0Buffer Row)
        {
            // Encapsulate the logic from the Derived Column comparison here 
            //
            // Are the two elements the same?
            // Do we have to worry about nulls here? Assuming not
            // Also assuming a case sensitive match is desired
            if (Row.Company == this.lastCompany && Row.Name == this.lastName)
            {
                Row.IsDuplicate = true;
            }
            else
            {
                // strictly speaking, this is not required as the default value for a bit if false but I favor explicit behaviour
                Row.IsDuplicate = false;
            }
    
            // Update the member variables to the previous row's data
            this.lastName = Row.Name;
            this.lastCompany = Row.Company;
        }
    }
    

    现在您可以将 Conditional Split 简化为我们列的条件IsDuplicate。我将任何匹配的行路由到名为“Sequential Duplicate”的输出,我的默认路径称为“First or non-duplicate rows”。再一次,我试着让我的意图变得显而易见,这样当我必须保持它时,我就可以让我的大脑重新投入到比赛中。

    在此处输入图像描述

    这导致我的数据流看起来像

    在此处输入图像描述

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve