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 值。
当我将数字列直接加载到货币列时,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 值。