从CSV文件溢出SSI上的数字数据

从CSV文件溢出SSI上的数字数据,csv,ssis,type-conversion,overflow,Csv,Ssis,Type Conversion,Overflow,所以,我需要将CSV文件中的数据加载到SQL Server中,但我面临一个似乎无法克服的问题。问题是,CSV上的一些数据点非常精确,有38个十进制数字+一个或两个整数字(例如89.95849436456480407115801673479014153261),我似乎无法加载它们而不溢出数据。数据以文本的形式输入,我尝试在数据转换步骤中将其转换为最大值(38,38),但仍然不够,并且一直溢出。以下是错误消息的一部分: Error: 0xC02020C5 at Data Flow Task, Dat

所以,我需要将CSV文件中的数据加载到SQL Server中,但我面临一个似乎无法克服的问题。问题是,CSV上的一些数据点非常精确,有38个十进制数字+一个或两个整数字(例如89.95849436456480407115801673479014153261),我似乎无法加载它们而不溢出数据。数据以文本的形式输入,我尝试在数据转换步骤中将其转换为最大值(38,38),但仍然不够,并且一直溢出。以下是错误消息的一部分:

Error: 0xC02020C5 at Data Flow Task, Data Conversion [2]: Data conversion failed while converting column "%Recycle Matl Week" (216) to column "%Recycle Matl Week" (61).  The conversion returned status value 2 and status text "The value could not be converted because of a potential loss of data.".
Error: 0xC0209029 at Data Flow Task, Data Conversion [2]: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR.  The "Data Conversion.Outputs[Data Conversion Output].Columns[%Recycle Matl Week]" failed because error code 0xC020907F occurred, and the error row disposition on "Data Conversion.Outputs[Data Conversion Output].Columns[%Recycle Matl Week]" specifies failure on error. An error occurred on the specified object of the specified component.  There may be error messages posted before this with more information about the failure.
Error: 0xC0047022 at Data Flow Task, SSIS.Pipeline: SSIS Error Code DTS_E_PROCESSINPUTFAILED.  The ProcessInput method on component "Data Conversion" (2) failed with error code 0xC0209029 while processing input "Data Conversion Input" (3). The identified component returned an error from the ProcessInput method. The error is specific to the component, but the error is fatal and will cause the Data Flow task to stop running.  There may be error messages posted before this with more information about the failure.
我真的被困在这个问题上,我总是觉得这是一个简单的解决方案,但就是不能得到它。从源代码更改CSV是不可能的,但是我真的不需要那么高的精度(8位小数就足够了)。谢谢你的帮助,谢谢

使用十进制(38,38)时,小数前面的数字不会留下任何空格,因此会溢出

使用DECIMAL数据类型时,第一个数字是字段中允许的数字量,第二个数字是允许这些数字中有多少是十进制的

比如说

  • 十进制(5,4)
    • 1.2345行
    • 12.345将失败,因为您只在前面留下一个数字,在后面留下4个数字,前面的2个数字将溢出
  • 十进制(5,1)
    • 1.2345可以工作,但四舍五入为1.2,小数点后的溢出将四舍五入以适合
    • 12.345可行,但四舍五入为12.3
    • 12345.6将失败,因为小数点1占用一个空格,因此小数点前面只有4位数字
在您的情况下,小数点前面至少需要两位数字,这样小数点(38,36)就可以工作了

选择转换(十进制(38,36),'89.95849436456480407115801673479014153261')

转换解决方案也不起作用,因为某些数据点中仍有38位十进制数字,加上整位数,仍然溢出。我试着使用双浮动,但也不起作用。但我使用辅助表管理了一个变通方法:

我从一个辅助步骤开始,在SQL Server上创建并填充一个类似的表,但所有数据都是VARCHAR,而不是NUMERICAL。然后,我更改了使用LEFT剪切数据并转换为数字的SQL代码。例如:

CAST(
    CAST(LEFT([Total Weight Var %],12) AS DECIMAL(13,8)) / 100 
AS DECIMAL(13,8)) AS OVER_WEIGHT_PCT,

这不是最优雅的解决方案,但它确实有效。

您只需读取VARCHAR并在数据流中的派生列中以相同的方式进行修剪,就可以在没有附加表的情况下实现这一点,