【问题标题】:special symbol avoid in sssis特殊符号避免在 ssis
【发布时间】:2014-06-26 17:53:25
【问题描述】:

我对 ssis 有点怀疑。请告诉我如何解决这个问题

源表:emp id,数据类型为 varchar(30),sal money 的名称

             id|  name |  sal 
             1 |  abc   |100
            ,2"|  def   |2500
             3 |  ",rac"|1400
             4 |  ven   |200
           "5",|  jai   |100
             10|  ha    |50

当我们将此数据加载到目标表时,我们需要加载正确的数据

目标表数据类型也是 id,name 有 dataype varchar(30),sal money

目标表数据如下所示

目标表:空参数

              id   |  name  | sal
              1   |  abc   |100
              4   | ven    |200
              10  |  ha    | 50

并将错误记录加载到单独的表中

     error table:emperror 
                           id  | name   | sal
                           ,2" |  def   |2500
                            3  |  ",rac"|1400
                           "5",|  jai   |100

当源数据有特殊符号记录需要发送错误表时,条件拆分和其他方式如何写条件。

【问题讨论】:

  • 你有这些特殊符号的完整列表吗?
  • 所有数据符号都像 ,"!@#$%^*( 。有什么符号表示我们需要将数据分开。谢谢
  • 仅表示这些符号 - "!@#$%^*( ?
  • 每一个有这个符号的数据都是错误的数据,所以我们需要分离那些有这个符号的数据。

标签: ssis


【解决方案1】:

由于您需要匹配多个字符,我建议采用以下方法;

  1. 创建脚本转换。
  2. 根据源表中的输入列创建必要的输出列。再添加一个bool 类型的输出列,称为IsValid
  3. 在脚本的ProcessInputRow 方法中,使用模式匹配检查id 列仅包含数字,name 列仅包含字母。如果不是这种情况,请将IsValid 设置为false

    using System.Text.RegularExpressions;
    
    ...
    
    public class ScriptMain : UserComponent
     {
       bool isValid = true;
    
       ...
    
       public override void Input0_ProcessInputRow(Input0Buffer Row)
        {
         if (Regex.IsMatch(Row.id, @"^[0-9]+$") && Regex.IsMatch(Row.name, @"^[a-zA-Z]+$"))
          {
            Row.derivedid = int.Parse(Row.id);
            Row.derivedname = Row.name;           
          }
         else
          {            
            isValid = false;
          }         
    
          Row.IsValid = isValid; 
        }
    
    }
    
  4. 接下来添加一个Conditional Split 转换,并根据IsValid 是真还是假,将行重定向到相应的目标。

【讨论】:

  • 当我使用这个脚本时,所有记录都将(有效的列)视为假。它不满足我们的条件。即使好的行也会变为假条件。请参见上面给出的示例源数据。如果记录工作满了,然后我会做任何剩余的符号来。谢谢
  • 对不起,我错过了初始化为真。请立即尝试。
  • 只有相同的结果。previous 和 now.it 不完全是我们的结果。谢谢
  • SELECT [name] FROM [test].[dbo].[nametest] where name like '[a-zA-Z]%' or name like '%"%' or name like '% ,%' 那个时候我得到了不匹配的记录。但是这个逻辑不是好方法。我们需要好的和坏的记录。是否可以在条件拆分中实现这个逻辑
  • 嗨,为什么我们采用 Row.derivedid = int.Parse(Row.id); Row.derivedname = Row.name;我们没有声明任何where Row.derivedid 和derivedname。它无法遵循相同的脚本。请告诉我如何避免这个问题。
猜你喜欢
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多