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
请回答
答案 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。