在将数据导入 SQL Server 2008 数据库之前,我使用 SSIS 处理来自旧系统的数据。货币字段的格式如下:
000000xxx.xx
我需要删除前导零。请注意,实际货币价值没有固定的位数。因此,例如,它可能是 xxxxx.xx 或 x.xx 或 xxxxxxxxxxx.xx
我找到了这个答案,但派生列工具仅显示有限的字符串函数,例如 Access 公式向导。
所以我的问题:
- 如何在 DTS 派生列工具中使用 PATINDEX
- 否则,如何从输入列中删除前导零
在将数据导入 SQL Server 2008 数据库之前,我使用 SSIS 处理来自旧系统的数据。货币字段的格式如下:
000000xxx.xx
我需要删除前导零。请注意,实际货币价值没有固定的位数。因此,例如,它可能是 xxxxx.xx 或 x.xx 或 xxxxxxxxxxx.xx
我找到了这个答案,但派生列工具仅显示有限的字符串函数,例如 Access 公式向导。
所以我的问题:
你是如何查询数据的?我想您在 OleDBSource 组件上使用直接表访问,对吧?我不建议这样做,因为桌子上的微小变化可能会破坏您的包裹。
我会正确包含从源表中选择的视图,在此选择中我将使用 PATINDEX 函数,在包内,我将选择视图而不是表。
这是一个很好的方法,因为如果你需要做一个小的改变,你可以改变视图而不是包
如果你不想写视图,没关系,而不是选择“数据访问模式”=“表或视图”,选择“sql命令”,直接在包上写你的sql。
您是否无法将数据转换为源系统中的数字等效类型?这应该是删除前导零的快速方法。SELECT CAST(myCurrency AS decimal(18,2)) AS leadingZerosDropped FROM myTable
否则,最简单的 SSIS 方法是使用数据转换任务并将其转换为数字类型(DT_CY/Currency 或 DT_Numeric/Numeric 工作得很好)
SELECT '000000111.11' AS stringCurrency
UNION ALL SELECT '0.22'
UNION ALL SELECT '03.33'
UNION ALL SELECT '004.44'
UNION ALL SELECT '0005.55'
UNION ALL SELECT '00000000000000000006.66'
我创建了一个新列,currencyCurrency,它是 stringCurrency,应用了货币 [DT_CY] 的数据类型。
stringCurrency currencyCurrency
000000111.11 111.11
0.22 0.22
03.33 3.33
004.44 4.44
0005.55 5.55
00000000000000000006.66 6.66
我完全支持不使用表访问模式,总的来说,我赞成将工作推到源系统上,但如果源系统不允许转换或者你不得不求助于字符串。