将varchar值“N”转换为数据typesint时转换失败

我从“收购”表中find债券的原始余额,个人“performance”季度。 它在每个季度都有效,但是当我试图在2010年1季度运行我的查询时,我收到了这个通知:

Msg 245, Level 16, State 1, Line 2 Conversion failed when converting the varchar value 'N' to data type int. 

我的查询是:

 SELECT ALL a.[LOAN IDENTIFIER] ,[CHANNEL] ,[SELLER NAME] ,[ORIGINAL INTEREST RATE] ,[ORIGINAL UNPAID PRINCIPAL BALANCE (UPB)] ,[ORIGINAL LOAN TERM] ,[ORIGINATION DATE] ,[FIRST PAYMENT DATE] ,[ORIGINAL LOAN-TO-VALUE (LTV)] ,[ORIGINAL COMBINED LOAN-TO-VALUE (CLTV)] ,[NUMBER OF BORROWERS] ,[ORIGINAL DEBT-TO-INCOME RATIO] ,[CREDIT SCORE] ,[FIRST-TIME HOME BUYER INDICATOR] ,[LOAN PURPOSE] ,[PROPERTY TYPE] ,[NUMBER OF UNITS] ,[OCCUPANCY STATUS] ,[PROPERTY STATE] ,[ZIP (3-DIGIT)] ,[MORTGAGE INSURANCE PERCENTAGE] ,[PRODUCT TYPE] FROM dbo.Performance_2010Q1 a join dbo.TotalAcquisition b on a.[Loan Identifier] = b.[LOAN IDENTIFIER] Where a.[Zero Balance Code] = 97 or a.[Zero Balance Code] = 03 

零余额代码告诉债券如何违约,我根据每个债券的“贷款标识符”

谢谢! 😀

由于在字段列表中没有明确的转换,因此它必须是ONWHERE子句中的隐式转换。

对于导致转换的ON子句, 贷款标识符必须被定义为一个nvarchar ,并在另一个表中被定义为一个int 。 这不太可能(虽然不是不可能;-)

所以我怀疑你的WHERE子句。 如果零平衡代码被定义为nvarchar并且您正在比较一个int (97或3),这将导致隐式转换。 如果只有一个表中包含字符的条目,则此隐式转换将失败。 避免这种情况的一种方法是用string定义WHERE子句(例如, WHERE A.[Zero Balance Code] = '97''03' )。 一个稍微优雅的方法是用ISNUMERIC检查数字数据。 因为你怎么知道平衡代码总是'03'而不是'3' ? 这些条目将被过滤掉,因为'3'不等于'03'

不过要小心:
这可能是无视真正的问题。 这里最大的问题是,为什么突然你的表中有非数字数据! 你需要检查你是否有损坏的数据input到你的系统。

在[Zero Balance Code]中是否有值不能转换为int的值?

试试这个你的地方caluse:

 Where a.[Zero Balance Code] = '97' or a.[Zero Balance Code] = '03'