【问题标题】:SQL cannot convert an int to a varchar(15) value and throws: Conversion failed when converting the varchar value ' LBS' to data type intSQL 无法将 int 转换为 varchar(15) 值并抛出:将 varchar 值“LBS”转换为数据类型 int 时转换失败
【发布时间】:2019-08-07 18:42:15
【问题描述】:

我正在从事一个 SQL 项目,该项目从许多表中提取数据以在电子邮件正文中列出它们。在我的电子邮件正文中,我正在提取引发异常的 int 值,因为正文最终需要是 nvarchar(max)。不同类型的转换尚未对我起作用。

这是在 Microsoft SQL Server Management Studio 上运行的 SQL。我尝试过不转换 int,以及我在其他地方看到的几种不同的转换方法。

在示例中,wtpc.Reg_No 是 varchar,wtpc.Shipment_Net_Weight 是 int。

'Body' = 
...
+ 'Net:     ' +
    CASE
        WHEN wtpc.Reg_No IS NOT NULL THEN wtpc.Shipment_Net_Weight
        ELSE '0'
    END
    + ' LBS'
+ 'Gross:
...

导致:将 varchar 值“LBS”转换为数据类型 int 时转换失败。

'Body' = 
...
+ 'Net:     ' +
    CASE
        WHEN wtpc.Reg_No IS NOT NULL THEN str(wtpc.Shipment_Net_Weight)
        ELSE '0'
    END
    + ' LBS'
+ 'Gross:
...

导致:将数据类型 varchar 转换为 float 时出错。

'Body' = 
...
+ 'Net:     ' +
    CASE
        ELSE wtpc.Reg_No IS NOT NULL THEN
                                      CONVERT(INT,                               
                                              CASE                                           
                                                   WHEN IsNumeric(CONVERT(VARCHAR(15), wtpc.Shipment_Net_Weight)) = 1 
                                                   THEN CONVERT(VARCHAR(15),wtpc.Shipment_Net_Weight)

                ELSE 0 
         END) 
        ELSE '0'
    END
    + ' LBS'
+ 'Gross:
...

导致:将 varchar 值“LBS”转换为数据类型 int 时转换失败。 这是从这个StackOverflow Question提升的

这是一个更完整的视图:

Declare @TempResults1 table(
ThisSubject nvarchar(max),
ThisTo nvarchar(max),
ThisCC nvarchar(max),
ThisBody nvarchar(max),
ThisBody2 nvarchar(max))

Insert into @TempResults1
Select 

'Subject' = 
isnull( @ShipmentNoString, '') + ' - ' + shpr.Last_Name + ', ' + shpr.First_Name + isnull(' - '  +  @ModeString, '') 
+ case
    when cstm.broker_agent = -1 then ' - Foreign Port Agent Pre-Alert'
    else ' - Port Agent Pre-Alert'
end,

... [To and CC are set here similiar to how the subject is set]
'Body' = 

+ 'To:   ' +  vncb.Vendor_Name
+ 'Attn: ' +
    case
        when @GsaUsContact is not null then @GsaUsContact
        else @GsaForContact
    end
+ 'From: ' + usrs.Name
+ 'Date: ' + format(getdate(), 'ddMMyy')
... [More similar code]
+ 'Mode:    ' + mode.Mode
+ 'Net:     ' +
    case
        when wtpc.Reg_No is not null then CAST( wtpc.Shipment_Net_Weight AS varchar(15))
        else '0'
    end
    + ' LBS'
+ 'Gross:   ' +
    case
        when wtpc.Reg_No is not null then CAST( wtpc.Shipment_Gross as varchar(15))
        else '0'
    end
    + ' 2LBS'
+ 'Cube:    ' + isnull(wtpc.Shipment_CFT, '0') + ' CFT'
+ 'Pieces:  ' +
    case
        when wtpc.Reg_No is not null then CAST(wtpc.Shipment_Piece_Count, varchar(15))
        else '0'
    end
    + ' PCS'
+ '<BR>'

+ 'OBL/AWB #:   ' + asea.Mawb_Obl_No
...[More code like above with varchars]
+isnull('<b>   Please send all correspondence to:  ' + usrs.email + '.</b>', '')

,Body2 = null

【问题讨论】:

  • 我们似乎遗漏了很多您的 SQL,因为该语句本身是无效的。尽管'LBS' 不是整数,但错误在这里告诉您问题。
  • 我的猜测是问题就在这里。 ELSE 0
  • 由于wtpc.Shipment_Net_Weight 是int,并且int 具有比varchar 更高的数据类型优先级,因此您最终会得到wtpc.Shipment_Net_Weight + ' LBC' = 123 + ' LBC' 您不能“添加”字符串@ 987654332@ 到数字 123 并因此出现错误。您需要将wtpc.Shipment_Net_Weight 转换为具有适当长度的varchar。
  • @Larnu 有很多代码,你到底需要什么?我试图包含相关的部分,我的错。
  • 真正让我震惊的是缺少前导单引号,@JoeyC。我添加了它,因为很明显语句的开头实际上是一个文字字符串。如果这是假设错误,我们需要完整的陈述,如果不是,我的上述评论适用。

标签: sql sql-server


【解决方案1】:

找到解决办法:

isnull( convert(varchar(50), wtpc.Shipment_Net_Weight), '')

没有匹配的案例,但错误没有显示这个,有点傻!谢谢大家的帮助!

【讨论】:

  • 通常在 SQL 中,从 WHERE 子句的另一部分排除的行会触发这些错误。我还看到 CASE 语句这样做 - CASE 语句返回的第一个结果会将语句的预期类型“设置为查询分析器”。您可以做的最快的事情是重新排序 CASE 语句。
猜你喜欢
  • 2018-07-13
  • 1970-01-01
  • 2011-12-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多