You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CONVERT和CAST无法将'10.00000'转为'10'的SQL技术问题

问题:VARCHAR类型列数值格式转换失效

我有一个所有列均设为varchar类型的表,原因是源文件中的列包含多种数据类型,尝试加载为普通表未成功。前6行从文件加载后,我用Column 0的值构建动态SQL传入数据流任务,该动态SQL执行后返回预期的10,但数据流将其追加到表后显示为10.00000,用SSMS查询目标库表也显示10.00000。提取该表到扁平文件时,尝试多种转换方法均无法将'10.00000'转为'10'、'0.00000'转为'0',扁平文件始终显示原格式。

原查询语句:

SELECT 
      [Column 0]
      ,[Column 1]
      ,[Column 2]
      ,[Column 3]
      ,[Column 4]
      ,[Column 5] --需转为10而非10.00000
      ,[Column 6]  --需转为10而非10.00000
      ,[Column 6]  --需转为0而非0.00000
      ,[Column 7]
      ,[Column 8]
      ,[Column 9]
      ,[Column 10]
      ,[Column 11]
      ,[Column 12]
      ,[Column 13]
      ,[Column 14]
      ,[Column 15]
      ,[Column 16]
      ,[Column 17]
  FROM [Voxware].[dbo].[VoxPackListIn]

尝试过的转换语句:

--CONVERT(varchar(5),CAST([Column 6] AS Integer)) as [Column 6],
--CONVERT(VARCHAR(5),TRUNC(CAST([Column 5] AS NUMERIC)))
--CONVERT(varchar(5),CAST(ABS(QUANTITY) AS Integer)) AS QUANTITY
--CONVERT(VARCHAR(5),(CAST(ROUND([Column 5],0) AS NUMERIC)))
--Cast(QUANTITY AS Integer)

解决方案1:SQL层面使用STR()函数处理

STR()函数可直接控制数值的字符串格式,指定小数位数为0即可去掉末尾的.00000:

SELECT 
      [Column 0]
      ,[Column 1]
      ,[Column 2]
      ,[Column 3]
      ,[Column 4]
      ,STR(CAST([Column 5] AS DECIMAL(18,5)), 5, 0) AS [Column 5]
      ,STR(CAST([Column 6] AS DECIMAL(18,5)), 5, 0) AS [Column 6]
      ,STR(CAST([Column 6] AS DECIMAL(18,5)), 5, 0) AS [Column 6_0]
      ,[Column 7]
      ,[Column 8]
      ,[Column 9]
      ,[Column 10]
      ,[Column 11]
      ,[Column 12]
      ,[Column 13]
      ,[Column 14]
      ,[Column 15]
      ,[Column 16]
      ,[Column 17]
  FROM [Voxware].[dbo].[VoxPackListIn]

如果数据无精度问题,也可用FLOAT替代DECIMAL,效率更高:

STR(CAST([Column 5] AS FLOAT), 5, 0) AS [Column 5]

解决方案2:SSIS数据流中用派生列组件转换

在数据流任务里添加派生列组件,针对目标列设置以下表达式,先转整数再转回字符串:

  • Column 5表达式:(DT_WSTR, 5)(DT_I4)[Column 5]
  • Column 6表达式:(DT_WSTR, 5)(DT_I4)[Column 6]
    该转换会自动去掉小数部分,直接生成'10'或'0'格式的字符串。

解决方案3:检查数据流目标表的类型映射

确认SSIS数据流中目标表的列映射是否正确:

  • 目标列必须设置为DT_STR或DT_WSTR(字符串类型),不能选数值类型
  • 如果误选数值类型,即使源是字符串,也会被隐性转换为带小数的数值后再存成字符串,导致出现'10.00000'格式

内容的提问来源于stack exchange,提问作者MaggieW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:48:22