0

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

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

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

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

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

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

4

2 回答 2

1

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

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

但它不适用于DT_NUMERIC. SSIS 不允许直接的数字结果,但它可以嵌套在强制转换为DT_DECIMAL. 只是为了证明,在表达式任务中,即使是这种“数字有效”的强制转换也是不允许的,因为输出根本不能是 type 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") 
于 2020-07-19T17:00:32.390 回答
0

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

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

我们可以完全忽略数据转换组件,只使用派生列任务来进行所有类型转换,无论是单一的还是嵌套的。我正在尝试这个,错误描述并不总是看起来很好,但是可以克服前一种方法的缺点。我会试试这个!

于 2020-07-20T16:25:19.137 回答