SSIS 中将文本转换为数字的数据正在删除字符

Data Conversion text to numeric in SSIS is removing characters

我在使用 SSIS“数据转换组件”将字符串转换为十进制数据类型时遇到了一个奇怪的问题。我使用 SSIS 2016.

源数据输入具有混合数据类型的值 - 字符串、整数、小数,并且在平面文件源中定义为 varchar。预期的目标数据类型是数字。当从字符串到十进制的显式类型转换发生时,我们希望字母数字值被拒绝并出现错误 table,并且只有数字值可以通过。 相反,我们看到一些字母数字值去掉了值中的字符并成功通过而没有错误。

示例:值“3,5”转换为 35 值“11+”转换为 11

我们无法控制源数据,也无法在将数据传递到数据转换组件之前替换 char 数据。 我们已经尝试了以下步骤作为解决方法,并且它奏效了。 即,

  1. 从 DT_STR 到 DT_NUMERIC
  2. 的第一次数据转换
  3. 捕获上述转换失败的错误行
  4. 从 DT_NUMERIC 到 DT_DECIMAL
  5. 的第二次数据转换

但由于源数据不可靠,我们可能不得不在任何有数字字段(int 类型和 deicmals)的地方应用此解决方法,这不是一个友好的解决方案。 因此,与大家核实一下,了解是否有人尝试过更简单、更好的解决方案。

我没想到这个结果,但我尝试了一个表达式任务并且它适用于 DT_DECIMAL:

(DT_DECIMAL,1)"11+" -- evaluates to 11.0

但它不适用于 DT_NUMERIC。 SSIS 不允许直接数值结果,但它可以嵌套在转换为 DT_DECIMAL 的内部。只是为了证明,在表达式任务中,即使这种“数字有效”的转换也是不允许的,因为输出根本不可能是 DT_NUMERIC:

类型
(DT_NUMERIC, 3, 0)123

但这是允许的:

(DT_DECIMAL,0)((DT_NUMERIC, 3, 0)123)

因此,只要您愿意指定一个足够大的精度和比例来在 DT_NUMERIC 完成的“有效性”检查期间保存您的数据,然后将其从那里转换为 DT_DECIMAL ,全部在派生列转换中,然后 DT_NUMERIC 似乎强制执行您想要的严格语义。

SSIS 允许:

(DT_DECIMAL,0)((DT_NUMERIC, 2, 0)"11") 

但两者都不是:

(DT_DECIMAL,0)((DT_NUMERIC, 2, 0)"11+") 

(DT_DECIMAL,0)((DT_NUMERIC, 2, 0)"3,5") 

@billinkc 很抱歉没有早点回复你。 我们在一些限制下工作: (1) 我们要做的就是捕获输入数据中的数据类型问题,因此我们想利用 SSIS 中 SSIS 数据转换组件的功能。 (2) DBA 不希望我们使用 SQL 进行类型转换,因此我们需要使用 SSIS 在平面文件源和平面文件目标之间进行这些转换。 (3) 我们需要将每一步转换的类型转换错误都捕获到一个错误输出文件中,其中包含错误列名和错误描述,以备后用。因此我们无法在将字段中的字符数据传递给数据转换组件之前将其删除。

@allmhuran - 我们在数据转换组件之前使用派生列任务来替换其他字段之一中的不必要字符,但使用相同的类型转换使得实现 (3) 变得困难。因为无法将派生列任务和数据转换组件的错误输出重定向到同一个错误输出文件。

我们可以完全忽略Data Conversion组件,只使用Derived column task来做所有的类型转换,无论是单一的还是嵌套的。我正在尝试这个并且错误描述并不总是看起来很好,但是可以克服前一种方法的缺点。我会试试这个!