Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 具有带空格的数字数据类型的SSIS平面文件_Sql Server_Ssis_Ssis 2012 - Fatal编程技术网

Sql server 具有带空格的数字数据类型的SSIS平面文件

Sql server 具有带空格的数字数据类型的SSIS平面文件,sql-server,ssis,ssis-2012,Sql Server,Ssis,Ssis 2012,我正在使用SSI将固定长度的平面文件加载到SQL中 我有一个体重场,整天给我带来麻烦。 它的长度为8,包含6个十进制位置99V990099 我遇到的问题是它没有填充并且有8个空间 我尝试的每件事都会出错: 转换规范的字符值无效。 或 转换失败,因为数据值溢出了指定的类型。。 或 数据转换失败。 列REL_WEIGHT的数据转换返回状态值2和状态文本 无法转换该值,因为可能会丢失数据 我尝试将其声明为DT_字符串&DT_数字 我已经尝试了以下多种方法: TRIM([REL_WEIGHT])==""

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

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

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

我尝试的每件事都会出错:

转换规范的字符值无效。 或 转换失败,因为数据值溢出了指定的类型。。 或 数据转换失败。 列REL_WEIGHT的数据转换返回状态值2和状态文本 无法转换该值,因为可能会丢失数据

我尝试将其声明为DT_字符串&DT_数字

我已经尝试了以下多种方法:

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
但似乎什么都不管用


请外面有人来解决这个问题

我认为您可能与以下几点有冲突,请在以下网站上详细解释:

您可以将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")

一定有更好的方法,但我找到了一种有效的方法

创建派生列表达式: TRIMREL_重量==?DT_STR,912520.0000000:DT_STR,91252Leftrel_权重,2+。+右相对重量,6

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

然后将[Copy of NewField]映射到设置为小数8,6的我的SQL表字段

我不知道当加载一百万条记录时,它的性能会如何,可能不是最好的。如果有人知道如何在性能方面更好地做到这一点,请让我知道

谢谢,
Jeff

我在SQL表中创建了两个新列。1为Char8,1为INT,以及已存在的列为小数点8,6。所以我尝试的每件事我都有一个地方来加载每件事,从各个方面找到一些有用的东西。当你说列已经是小数8,6时,你的意思是你已经使用目标数据类型加载了平面文件数据,即REL_WEIGHT列的小数?这是不对的;必须将其作为字符串类型加载,因为在将其转换为decimal.IIRC之前必须对其进行验证,平面文件连接管理器编辑器是配置初始加载类型的地方。您必须在该编辑器中将它们设置为字符串。参考粘贴到答案中的示例代码,我首先从平面文件中加载名为Last_Update_Time_orig的列作为DT_STR,然后代码将名为Last_Update_Time的新列作为DT_DBTIME2派生出来。我最近的尝试是将其作为字符串引入-使用表达式TRIMREL_WEIGHT==创建派生列?DT_STR,912520.0000000:DT_STR,91252Leftrel_权重,2+。+右相对重量,6。然后让它完成一个数据转换任务,将其从Unicode转换为字符串,或最终转换为数字。列小数8,6在我的SQL表设计中,但目前没有映射到那里。因此,我有3个测试目标字段,1设置为正确的小数8,6,1设置为字符9,以适合十进制,1设置为INT,以便在需要时进行测试。有一种更好的方法,即在派生列转换中直接转换为十进制。正如我在回答中所说,您可以在派生列转换中创建一个新列。这是通过在转换编辑器中指定不同于原始名称的新名称来实现的。对于我的示例,我将Last_Update_Time_orig作为原始字符串列,派生列转换从复制到答案中的SSIS表达式创建了一个名为Last_Update_Time的新列。上次更新是我映射到DB table列的时间。下面是编辑器的一个很好的屏幕截图:。注意文本。关于数据类型IIRC,它是从SSIS表达式自动派生的。因此,必须在表达式中获得正确的强制转换,以便表达式的结果类型是具有所需比例的十进制类型。请注意,在我的示例SSIS表达式中,我将NULLDT_DBTIME2,0指定为三元表达式的第一个替换,第二个替换具有DT_DBTIME2,0强制转换。因此,双方
s是类型一致的,并且整个表达式解析为时间类型。您必须执行相同的操作,但在表达式中键入DT_DECIMAL,6。我再次尝试删除数据转换块,但在尝试将其输入SQL表时再次出现转换错误。我星期一再试一次。这是一个最起码的工作了