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 ...
,则会返回完全相同的结果。
导致此错误的原因是什么?这是一个已知的问题吗?
答案 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
如果顶部查询的内部部分有效,则必须有一个实例,其中您使用的子字符串逻辑不会产生数值。我认为这是解决此类查询的最佳方法,隔离可能导致问题的部分并单独运行它们以查明错误。