SSIS-当目标是金钱时,OLE DB连接管理器将截断数值

时间:2018-11-05 16:18:46

标签: ssis oledbconnection

当我直接将数字列加载到money列时,OLEDB组件会截断其中的值,但是TSQL和ADO.NET组件会按预期四舍五入。

源值:2.081250

Vat1:直接映射,
Vat2:转换为Money数据类型后进行映射

    Result:
    VAT1    VAT2    CONN 
    2.0813  2.0813  TSQL
    2.0813  2.0813  ADO
    2.0812  2.0813  OLEDB

2.0812:数字->直接通过OLEDB赚钱

你有什么主意吗?它是OLEDB组件的默认行为吗?

关于

穆斯塔法

测试用例:

    -- Source
    CREATE TABLE TEST_NUMERIC(VAT1 NUMERIC(38,6), VAT2 NUMERIC(38,6))
    INSERT INTO TEST_NUMERIC VALUES( 2.081250, 2.081250)

    -- Destination 
    CREATE TABLE TEST_MONEY(VAT1 MONEY, VAT2 MONEY, CONN NVARCHAR(20))

    -- Test 1 - With TSQL
    INSERT INTO TEST_MONEY
    SELECT VAT1, CAST(VAT2 AS MONEY), 'TSQL' FROM TEST_NUMERIC 


    -- Test2 - With SSIS, ADO NET and OLE DB components:
    ADO.Net Source: 
    SELECT VAT1, CAST(VAT2 AS MONEY) VAT2, N'ADO' AS CONN
    FROM TEST_NUMERIC

    Ado .Net Destination: TEST_MONEY

    **OLE DB Source:** 

    SELECT VAT1, CAST(VAT2 AS MONEY) VAT2, N'OLEDB' AS CONN
    FROM TEST_NUMERIC

    OLEDB Destination: TEST_MONEY

SSIS Package:

1 个答案:

答案 0 :(得分:0)

DT_CY(用于货币的SSIS数据类型)的最大比例为4,并且OLE DB连接确实支持该数据类型,根据您示例中的数据(2.081250),该数据类型将为2.0812。由于您正在SQL Server中进行V2列的转换,因此在SSIS处理它之前将其舍入为2.0813。相当于ADO的货币为小数(引用here)。因此,尽管您可以在ADO.NET目标中添加money列并映射到源的数字数据类型,但目标money数据类型仍会解释为十进制,这样可以保留更长的比例,在这种情况下会四舍五入到您在此处看到的2.0813值。