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

时间:2014-04-09 09:09:49

标签: sql-server-2008

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

请回答

1 个答案:

答案 0 :(得分:0)

如果任何记录在VARCHAR列中包含除数字之外的任何内容,则将VARCHAR列CAST到INT将导致错误。因此,如果您的VARCHAR列具有字母或特殊字符,则在CAST转换为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