尝试转换和 CAST 不会将“10.00000”更改为“10”

问题描述 投票:0回答:1

我有一个表,其中所有列都设置为 varchar。这是必需的,因为文件中的数据在列中包含多种数据类型。

(PS我尝试将数据加载为表格,但没有成功)

前 6 行是从文件加载的。文件的格式是必需的。我使用第 0 列中的值构建动态 SQL 语句,并将其传递给数据流任务。下面的查询是根据表的第 1-6 行构建的动态查询。这不是问题查询。

SELECT  REQ_NUMBER
        ,LINE_NBR
        ,LTrim(Rtrim(ITEM)) AS ITEM
        ,[DESCRIPTION]
        ,LTrim(Rtrim(MANUF_NBR)) AS MANUF_NBR
        ,ENTERED_UOM
        ,Convert(varchar(5),Cast(QUANTITY AS Integer)) as newqty
        ,Convert(varchar(5),Cast(KILL_QUANTITY AS Integer)) as newkillqty
        ,Convert(varchar(5),Cast((QUANTITY - KILL_QUANTITY) AS Integer)) as newpickqty
        FROM [LSLMDB].[ls_apps].[REQLINE] 
        WHERE REQ_NUMBER LIKE 2286260  
        AND LINE_NBR <> 3 
        AND LINE_NBR <> 2 
        AND LINE_NBR <> 1 
        AND ITEM_TYPE like 'I' 
        and FILL_OR_KILL like 'K'

当我对源数据库执行上面的 sql 时,它返回预期的 10。但是数据流将其附加到上面的表中,显示 10.00000。当我使用 SSMS 从目标数据库的表中选择行时,它显示 10.00000。到目前为止,当我将表提取到平面文件时,我尝试过的任何操作都不会更改为 10.00000 到 10。我已经尝试了堆栈溢出帖子中建议的方法。 问题查询是:

SELECT 
      [Column 0]
      ,[Column 1]
      ,[Column 2]
      ,[Column 3]
      ,[Column 4]
      ,[Column 5] --making this result in 10,not 10.00000 in the flat file
      ,[Column 6]  --making this result in 10,not 10.00000 in the flat file
      ,[Column 6]  --making this result in 0,not 0.00000 in the flat file
      ,[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)

我确信还有其他迭代,但我已经这样做了 2 天,并且没有保存不起作用的内容。该文件始终包含 10.00000。

sql ssis casting sql-convert
1个回答
0
投票

乔什提供的解决方案有效。我使用 case 语句来确定是否应该进行转换。

SELECT 
      [Column 0]
      ,[Column 1]
      ,[Column 2]
      ,[Column 3]
      ,[Column 4]
      ,CASE
            when seqnum > 3 then CONVERT(VARCHAR(5),CONVERT(INTEGER,CONVERT(FLOAT,[Column 5]))) --making this result in 10,not 10.00000 in the flat file
            Else [column 5]
       End as newcol5
      ,CASE
            when seqnum > 3 then CONVERT(VARCHAR(5),CONVERT(INTEGER,CONVERT(FLOAT,[Column 6]))) --making this result in 10,not 10.00000 in the flat file
            Else [column 6]
       End as newcol6
      ,CASE
            when seqnum > 3 then CONVERT(VARCHAR(5),CONVERT(INTEGER,CONVERT(FLOAT,[Column 7]))) --making this result in 10,not 10.00000 in the flat file
            Else [column 7]
       End as newcol7
      
      ,[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]
© www.soinside.com 2019 - 2024. All rights reserved.