将varchar值转换为int时,CAST失败

时间:2013-12-14 17:16:31

标签: sql sql-server sql-server-2008-r2

Microsoft SQL Server 2008 R2,出现意外的“转换失败”错误。

不太确定如何描述这个问题,所以这是一个简单的例子。当我解析数据库中的某些列时,如下所示:

SELECT CAST(RIGHT(CurLovim,LEN(CurLovim)-1) As INT) FROM
(
 SELECT SUBSTRING(...) as CurLovim
 FROM [BackOfficeFut].[dbo].[our_orders]
 WHERE isin_id IN 
 (
  SELECT distinct isin_id 
  FROM [BackOfficeOpt].[dbo].[opt_sess_contents]
  WHERE base_isin_id = 335568
 )
)as t1

我收到错误:

  

将varchar值'UR'转换为数据类型int时,转换失败。

但如果我以isin_id这种方式更改条件(相当于):

SELECT CAST(RIGHT(CurLovim,LEN(CurLovim)-1) As INT) FROM
(
 SELECT SUBSTRING(...) as CurLovim
 FROM [BackOfficeFut].[dbo].[our_orders]
 WHERE isin_id != 335568
)as t1

查询效果很好。

我觉得很奇怪,因为如果我删除CAST,即进行查询SELECT RIGHT(CurLovim,LEN(CurLovim)-1) FROM ...,则会返回完全相同的结果。

导致此错误的原因是什么?这是一个已知的问题吗?

2 个答案:

答案 0 :(得分:2)

您是否尝试过测试字符串以确保它可以转换为数字?

查看isnumeric()函数。

http://technet.microsoft.com/en-us/library/ms186272.aspx

-- Just play
USE tempdb;
GO

-- Create test table
CREATE TABLE T2
( C2 varchar(10) )
go

-- Insert data
INSERT INTO T2 VALUES ('a2b');
INSERT INTO T2 VALUES ('1ab');
INSERT INTO T2 VALUES ('ab3');
GO

-- Check column 2 before converting
SELECT 
  CAST(
    CASE 
      WHEN ISNUMERIC(SUBSTRING(C2, 2, 1)) = 0 THEN 0
      ELSE SUBSTRING(C2, 2, 1)
    END AS INT) AS N2
FROM T2;
GO

-- Remove the table
DROP TABLE T2;
GO

答案 1 :(得分:0)

您的字段base_isin_id中可能包含字符值,这可以解释在第一次查询的WHERE子句中进行转换时的失败。

此外,查询不相同。 您要查找的第一个查询isin_id base_isin_id = 335568 第二个是你isin_id

所有isin_id != 335568

如果顶部查询的内部部分有效,则必须有一个实例,其中您使用的子字符串逻辑不会产生数值。我认为这是解决此类查询的最佳方法,隔离可能导致问题的部分并单独运行它们以查明错误。