删除双引号时替换和子字符串会产生不同的值

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

背景

  1. 使用 SQL Server 2016 读取 CSV 文件(无可用格式选项)。

  2. 这些文件是 crlf/windows,每个值都将用双引号引起来。 文件位于此处,请注意,为了保持一致性,我将它们更改为 crlf。

问题

时不时地,我经常在数字中看到这种情况,当我们尝试执行替换(value,'“','')然后转换为int时,它将失败并出现以下错误

错误

转换 nvarchar 值时转换失败'331877 ' 转换为 int 数据类型。

但是如果我们执行 substring() ,它会产生一个无法转换为 int 的值。

超级黑客恕我直言,因为你需要使用 len() 猜测字符串的长度。

我已经验证了替换和子字符串的结果看起来完全一样,但是当我运行时

nullif(replace(value, '"', ''), substring(value, 2, len(value)-2))

它声称它们在某种程度上有所不同。 (斗鸡眼)它们看起来一样……它们是相同的类型……它们是相同的,但 nullif 认识到出了问题。我的代码如下。也许联盟有什么事情??

bulk insert #tmp
    From 'C:\acquisition_samples.csv'
    WITH
        (
            CODEPAGE = '65001'
            ,FIRSTROW = 2
            ,FIELDTERMINATOR = ','
            ,ROWTERMINATOR = '0x0A'  
            ,batchsize=10
            ,TABLOCK
        );
    -- DDL
    insert into acquisition_sample(fdc_id_of_sample_food, fdc_id_of_acquisition_food) -- UPDATE file name, and columns
        select
            nullif(REPLACE(t.fdc_id_of_sample_food, '"', ''), substring(t.fdc_id_of_sample_food,2,LEN(t.fdc_id_of_sample_food)-2))
            , nullif(REPLACE(t.fdc_id_of_acquisition_food, '"', ''), substring(t.fdc_id_of_acquisition_food,2,LEN(t.fdc_id_of_acquisition_food)-2)) as wtf
            , CAST(substring(t.fdc_id_of_sample_food,2,LEN(t.fdc_id_of_sample_food)-2) AS INT) 
            , t.fdc_id_of_acquisition_food
            , CAST(substring(t.fdc_id_of_acquisition_food,2,LEN(t.fdc_id_of_acquisition_food)-3) AS INT)
        from #tmp t

sql sql-server replace substring sql-server-2016
1个回答
0
投票

感谢@AlwaysLearning和@TN的提示

这个答案基本上帮助我解决了这个问题。 CSV 回车符

REPLACE(Fieldname, CHAR(13), '')

我意识到错误控制台中行尾的文本被下推一行的原因是它是一个回车符。

© www.soinside.com 2019 - 2024. All rights reserved.