如何避免在Openrowset中将十进制值读取为Float

时间:2018-12-03 07:12:52

标签: sql sql-server sql-server-2008 openrowset

在我的Excel中,一些值是这样的

11.17
3.35
2.28
1.4

General类型存储。

将excel导入数据库后,某些值的小数位将完全更改。

示例

SELECT * into #temp 
    FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',    
                    'Excel 12.0;IMEX=1;Database=D:\test\testfile.xlsx',
                     [Data$])  

来自#temp的数据将被插入到数据类型为decimal(38,20)的目标表中。

11.17 is changed to 11.17000000000000000000
3.35 is changed to 3.35000000000000010000
2.28 is changed to 2.27999999999999980000--wrong
1.4 is changed to 1.39999999999999990000--wrong

检查后,我发现#temp中列的数据类型为float,这导致此问题是其近似数据类型。

有没有办法避免将其存储在float中?

我知道我们可以使用BULK文件的fmt选项,但是excel中的列数不是静态的,因此我不能使用该选项。

1 个答案:

答案 0 :(得分:0)

尝试一下:

SELECT * as [Decimal] into #temp 
    FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',    
                    'Excel 12.0;IMEX=1;Database=D:\test\testfile.xlsx',
                     [Data$])  

可能会在*上大惊小怪。您应该选择[ColumnName]作为[Decimal]。