带有空格的数值数据类型的SSIS平面文件

时间:2015-04-01 21:07:44

标签: sql-server ssis ssis-2012

我正在使用SSIS将固定长度的平面文件加载到SQL中。

我有一个重量场,整天给我带来麻烦。 它的长度为8,有6个十进制位置(99V990099)。

我遇到的问题是它没有填充并且有8个空格。

我尝试的所有内容都会出错:

“强制转换规范的字符值无效”。“ 要么 “转换失败,因为数据值溢出指定的类型。” 要么 数据转换失败。 “REL_WEIGHT”列的数据转换返回状态值2和状态文本 “由于可能会丢失数据,因此无法转换该值。”

我已经尝试将其声明为DT_String& DT_NUMERIC。

我尝试了很多变种:

TRIM([REL_WEIGHT])=="" ? (DT_STR,8,1252)NULL(DT_STR,8,1252) : REL_WEIGHT

ISNULL([REL_WEIGHT]) || TRIM([REL_WEIGHT]) == "" ? (DT_NUMERIC,8,6)0 : (DT_NUMERIC,8,6)[REL_WEIGHT]

TRIM(REL_WEIGHT) == "" ? (DT_NUMERIC,8,6)0 : (DT_NUMERIC,8,6)REL_WEIGHT

但似乎没有任何效果。

请有人在那里有解决方法!

2 个答案:

答案 0 :(得分:0)

我认为你可能会碰到以下几点,在http://vsteamsystemcentral.com/cs21/blogs/applied_business_intelligence/archive/2009/02/01/ssis-expression-language-and-the-derived-column-transformation.aspx很好地解释:

  

您可以将DT_STR Cast语句添加到MiddleName的表达式,但不会更改数据类型。为什么我们不能在派生列转换中更改现有列的数据类型?我们正在替换值,而不是更改数据类型。是否无法更改派生列中现有列的数据类型?让我们这样说:当你只是替换值时,不可能转换列的数据类型。但是,您可以通过在数据流中创建新列来实现相同的目标。

我在过去的情况下通过将平面文件中的数据作为字符串加载,然后在衍生列转换中导出一个新数据类型来解决这个问题。然后,您可以在转换中的新列的SSIS表达式中执行适当的修剪,验证,转换等。

在这里,我找到了一个示例SSIS表达式,我在一个点使用它来从4位数字符串中导出时间值:

(ISNULL(Last_Update_Time__orig) || TRIM(Last_Update_Time__orig) == "") ? NULL(DT_DBTIME2,0) : (DT_DBTIME2,0)(SUBSTRING(TRIM(Last_Update_Time__orig),1,2)+":"+SUBSTRING(TRIM(Last_Update_Time__orig),3,2)+":00")

答案 1 :(得分:0)

必须有更好的方法来做到这一点,但我发现了一种有效的方法。

创建派生列表达式:     TRIM(REL_WEIGHT)=="" ? (DT_STR,9,1252)" 0.0000000" :(DT_STR,9,1252)(LEFT(REL_WEIGHT,2)+"。" + RIGHT(REL_WEIGHT,6))

然后创建数据转换任务以将其更改为数字并将比例设置为6.

然后将[NewField的副本]映射到我设置为Decimal(8,6)的SQL表字段。

我不知道在加载一百万条记录时的表现如何,可能不是最好的。如果有人知道如何以更好的方式表现,请告诉我。

谢谢, 杰夫