【问题标题】:ssis filter out rows with values starting in a letterssis 过滤掉值以字母开头的行
【发布时间】:2016-11-21 06:44:38
【问题描述】:

在一个 SSIS 项目中,我试图从 Excel 文件源中过滤掉行,其中列的值以字母开头,后跟数字。某些单元格包含多个值,并且并非所有单元格都遵循数据类型格式。目前数据流如下:
Excel Source > Data Conversion > OLE DB Destination
我在 Excel 源之后添加了条件拆分,但我对如何过滤掉不需要的记录感到困扰。以下是在数据流结束之前不应包含的值示例:

Row      Value
1        1234
2        P123
3        P1234, P456
4        rec P678

第 1 行应该是唯一应该流向目的地的行。有没有办法过滤掉以“P”开头并后跟数字的记录,而不管每个单元格中有多少值?

更新:我目前正在解决 FINDSTRING(Value,"P",1) > 0 || FINDSTRING(Value,"p",1) > 0。输出阻止第 2-4 行,但第 1 行的值更改为 0。有人知道为什么会这样吗?

【问题讨论】:

  • 只需按照示例执行您的要求simple-talk.com/sql/ssis/…
  • 嗨!感谢您的回复,但我正在为我的 Conditional Split 寻找更具体的编码建议。基本上,拆分应该“阻止”其他行,因为它们包含以 P 作为第一个字符的记录,但后面是数字。这意味着如果值为“Person Value 1234”,则不应阻止该记录,因为“P”后面没有数字。我当前的代码(还不行)是: FINDSTRING(Value,"P",1) > 0 && CODEPOINT(SUBSTRING([Value],FINDSTRING(Value,"P",1),3)) > 47 && CODEPOINT(SUBSTRING(Value,FINDSTRING(Value,"P",1),7))
  • 我猜您的第一行更改为零可能与 Excel 驱动程序猜测数据类型的 可怕 方法有关。它猜测数据类型错误,您对此无能为力。在这个链接msdn.microsoft.com/en-us/library/ms141683.aspx 阅读标题为缺失值的部分。这个问题在网上到处都是。我不知道为什么你的值是零而不是 NULL 但我很确定就是这样。查找 IMEX 的解决方法
  • 零是 FINDSTRING() 找不到东西时的预期回报。 FINDSTRING() 计算字符串的出现次数。整数是它的回报。当它没有找到某些东西时,预计会出现零次。

标签: sql sql-server excel ssis


【解决方案1】:

第一种解决方案

使用 .Net 方法检查值是否为数字的脚本组件。

1) 脚本组件 在需要检查的地方添加一个脚本组件(类型:转换)。

2) 选择输入列 添加需要检查的列作为输入列。

3) 添加输出列 在输入和输出选项卡上的输出列中添加一个新列。类型 shoot 是 Boolean 并给它一个合适的名字。

4) 脚本

' VB.Net 代码 ' 检查字符串值是否包含数字 进口系统 导入 System.Data 导入 System.Math 导入 Microsoft.SqlServer.Dts.Pipeline.Wrapper 导入 Microsoft.SqlServer.Dts.Runtime.Wrapper

Public Class ScriptMain
Inherits UserComponent

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
    ' Standard VB.net method, indicating whether
    ' an expression can be evaluated as a number
    If (IsNumeric(Row.InputCol)) Then
        Row.IsNumeric = True
    Else
        Row.IsNumeric = False
    End If
End Sub

End Class

5) 创建条件拆分以过滤行

第二个解决方案

派生列

1) 添加派生列 在需要检查的地方添加派生列。

2) 添加表达式 使用以下表达式添加一个新列并为其命名:!ISNULL((DT_I8)TextNumbers)。所有数字都会导致 True,所有非数字都会引发错误。

3) 忽略错误 转到派生列中的配置错误输出窗口并忽略新字段的错误。

4) 结果 使用ISNULL 表达式添加条件拆分以过滤行

第三种解决方案

数据转换

1) 带数据转换 第二种解决方案的替代方法是尝试通过数据转换转换将值转换为 int 并忽略任何错误。比使用ISNULL 表达式添加条件拆分来过滤行

【讨论】:

    【解决方案2】:

    您要检查的条件是查看字段是否为数字。不幸的是,我们在 SSIS 中没有直接的 ISNUMERIC 函数。

    请通过以下链接。我们可以通过使用派生列来实现这一点。

    Check IsNumeric() with Derived Column Transform in SSIS Package

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      相关资源
      最近更新 更多