当我直接将数字列加载到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
答案 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值。