【问题标题】:Conversion failed when converting varchar to data type int将 varchar 转换为数据类型 int 时转换失败
【发布时间】:2014-04-09 18:37:46
【问题描述】:
CREATE PROCEDURE [dbo].[GetIssuedGatePassByGatepassType]
(
    @GatePass_Type int,
    @plant int
)
AS
    SET NOCOUNT ON;

    SELECT     
       GatePass_Type, Batch_No, Issued, Batch_Id
    FROM         
       GatePass_Batch
    WHERE     
       (Issued = 0) 
       AND (GatePass_Type = @GatePass_Type)
       AND Location_Id = @plant
    ORDER BY 
       CAST(Batch_No AS INT) ASC

Batch_no 在表中属于数据类型varchar

这给了我一个类似

的错误

将 varchar 转换为数据类型 int 失败

请回答

【问题讨论】:

  • 为什么要将它转换为 int in order by 子句只需使用 order by 子句而不使用 CAST 函数。
  • Bad habits to kick : choosing the wrong data type - 你应该始终使用最合适的数据类型 - 毕竟这就是它们的用途!如果batch_no 是一个数字 - WHY 它不是存储为INTDECIMAL(10,2) 还是其他什么?为什么VARCHAR - 完全没有意义。 ....
  • IssuedGatePass_TypeLocation_Id 列的数据类型是什么?其中任何一个也可能会强制隐式转换为int
  • +1 @marc_s 的评论。如果您有一个VARCHAR 列,那么最终有人会在其中输入文本是否喜欢它,如果您假设它只包含数字,那么您的转换将失败。我的猜测是您在 Batch_No 字段中有流氓文本数据。
  • @M.Ali:对存储为 VARCHAR 的数字进行排序并不总是与存储为 INT 数据类型的数字相同。例如:1、10、100、11、12、2等……

标签: sql-server-2008


【解决方案1】:

如果任何记录在 VARCHAR 列中包含除数字以外的任何内容,则将 VARCHAR 列转换为 INT 将导致错误。因此,如果您的 VARCHAR 列有字母或特殊字符,则在转换为 INT 时它将失败。即使您只是想按该列进行排序。

要解决此问题,您可以在强制转换之前检查列的内容是否为纯数字:

ORDER BY
    CASE WHEN ISNUMERIC(Batch_No) = 1 THEN CAST(Batch_No AS INT) ELSE 99999999 END ASC

在这里,仅当 Batch_No 为数字时,我才将 Batch_No 排序为整数。如果 Batch_No 不是数字,我将按一些大数字进行排序,以确保非数字 Batch_No 记录出现在数据集的末尾。

请注意,ISNUMERIC 并不完美。它会在一些非常特殊的情况下返回 1,其中 CAST(Batch_No AS INT) 仍然会失败。例如:SELECT ISNUMERIC('$') 将返回 1,但 SELECT CAST('$' AS INT) 将导致错误。查看备注here 了解更多信息。另见this SO question

【讨论】:

    猜你喜欢
    • 2011-12-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多