SSIS - OLE DB 连接管理器在目标为金钱时截断数值

SSIS - OLE DB Connection Manager is truncating numeric value when the destination is money

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

源值:2.081250

Vat1:直接映射,
Vat2:转换为货币数据类型后的地图

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

2.0812 : numeric -> money directly with 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:

DT_CY(金钱的 SSIS 数据类型)的最大比例为四,OLE DB 连接支持此数据类型,根据您的示例 (2.081250) 中的数据,该数据类型为 2.0812。由于您在 SQL Server 中为 V2 列进行转换,因此在 SSIS 处理它之前将其四舍五入为 2.0813。货币的 ADO 等价物将是十进制的(参考 here)。因此,虽然您可以在 ADO.NET 目标中添加货币列并映射到源的数字数据类型,但目标货币数据类型仍被解释为十进制,这会保留较长的刻度,在这种情况下四舍五入到您在此处看到的 2.0813 值。