Sql 操作数数据类型varchar对于乘法运算符无效

Sql 操作数数据类型varchar对于乘法运算符无效,sql,sql-server-2012,Sql,Sql Server 2012,我发现“CPR”是一个基于债券不同方面的函数 我们目前的公式是: SELECT All a.[CUSIP NUMBER], CPR, a.[POOL PREFIX], a.[POOL NUMBER], a.[POOL TYPE], a.[CURRENT MM], a.[CURRENT YY], a.[ISSUE MM], a.[ISSUE DD], a.[ISSUE YY], a.[MATURITY MM], a.[MATURITY DD], a.[MATURITY YY], a.[SELLER

我发现“CPR”是一个基于债券不同方面的函数

我们目前的公式是:

SELECT All
a.[CUSIP NUMBER],
CPR,
a.[POOL PREFIX],
a.[POOL NUMBER],
a.[POOL TYPE],
a.[CURRENT MM],
a.[CURRENT YY],
a.[ISSUE MM],
a.[ISSUE DD],
a.[ISSUE YY],
a.[MATURITY MM],
a.[MATURITY DD],
a.[MATURITY YY],
a.[SELLER NAME],
a.[SELLER STREET],
a.[SELLER CITY],
a.[SELLER STATE],
a.[SELLER ZIP],
a.[ORIGINAL WA COUPON],
a.[SD SECURITY TYPE],
a.[SD INTEREST RATE],
a.[SD POOL PREFIX],
a.[SD POOL NUMBER],
a.[CURRENT WA COUPON],
a.[CURRENT BALANCE],
a.[ORIGINAL WA MATURITY],
a.[CURRENT WA MATURITY],
a.[PASS THRU RATE],
a.[CURRENT FACTOR],
b.[CURRENT FACTOR] as AprilFactor,
b.[ORIGINAL BALANCE],
MonthlyRate,
Payment,
InterestPayment,
Principle,
ScheduledFace,
PreviousFace,
ScheduledFactor,
SMM
INTO March2013CPR
FROM dbo.mbs022013 a
JOIN dbo.mbs032013 b ON a.[CUSIP NUMBER] = b.[CUSIP NUMBER]
CROSS APPLY (Select (a.[PASS THRU RATE]*.01)/12) CA(MonthlyRate)
CROSS APPLY (Select (a.[CURRENT BALANCE] * ((MonthlyRate)/((1-(1/power(1+ MonthlyRate, a.[CURRENT WA MATURITY]))))))) CA2(Payment)
Cross Apply (Select a.[CURRENT BALANCE] * MonthlyRate) CA3 (InterestPayment)
Cross Apply (Select Payment - InterestPayment) CA4 (Principle)
Cross Apply (Select a.[ORIGINAL BALANCE] * a.[CURRENT FACTOR]) CA5 (PreviousFace)
CROSS APPLY (Select PreviousFace - Principle) CA6(ScheduledFace)
Cross Apply (Select ScheduledFace/a.[ORIGINAL BALANCE]) CA7 (ScheduledFactor)
Cross Apply (Select 100 * (1-(b.[CURRENT FACTOR]/ScheduledFactor))) CA8(SMM)
Cross Apply (Select (1-(power(1-SMM/100,12)))*100) CA9 (CPR)
WHERE a.[CURRENT WA MATURITY] != 0 and a.[CURRENT BALANCE] != 0
我们通过交叉应用进行计算,这样我们就可以将整个投资组合发布到一个新表中,其中包含每种债券的CPR值。此函数已使用数月的数据,但本月它仅返回:

Msg 8117, Level 16, State 1, Line 49
Operand data type varchar is invalid for multiply operator.
这是计算三月的函数。三月的文件使用二月文件和三月文件中的信息。但是,我认为这两个文件都没有问题,因为该函数对于使用一月和二月的二月文件以及使用四月和三月数据的四月文件都是正确的

第49行是这样写的:

Cross Apply (Select a.[ORIGINAL BALANCE] * a.[CURRENT FACTOR]) CA5 (PreviousFace)
有没有办法解决这个问题-D

更新:

以下是一些示例数据:

CUSIP NUMBER     Original Balance     Current Factor     Pass Thru Rate  Current Balance
31416HAB1        00000325972000       0.19556008         04.500         00000063747109
31416HAB1        00003749061700       0.11487645         05.000         00000430678890
31416HAC9        00002164121900       0.15490762         05.500         00000335238974
31416HAD7        00000274716900       0.22204878         06.000         00000061000552
31416HAE5        00018198400200       0.10905233         06.000         00001984577976

当前WA到期日范围为0-360。

根据@Alex K和Dev n00b的评论展开,您的[原始余额]中似乎有字符数据,前导的零证明了这一点。数据类型优先级允许从字符类型(char/varchar/nchar/nvarchar)隐式转换为数字类型(int/float/decimal)

在数据的某个地方,该列中似乎有一个非数值。如果强制转换失败,转换也将失败。您可能需要找到不正确的行并更正数据。否则,如果您可以忽略这些值,并且由于您使用的是SQL Server 2012,那么您可以利用以下功能

Cross Apply (Select TRY_CONVERT(bigint, a.[ORIGINAL BALANCE]) * a.[CURRENT FACTOR]) CA5 (PreviousFace)

如果这两个字段都是字符数据类型,那么就会发生这种情况。在发布之前,请检查表schemabe,尝试创建最简单的查询来重现问题。将示例数据与查询一起发布。基本上类似于@AlexK。他说。您正在尝试将一个不可能发生的变量进行乘法。如果它看起来像一个数字,但存储为varchar,则必须将该语句包装为强制转换或转换为Float@Dev谢谢你的帮助!我会试试演员阵容,因为转换成浮动并没有解决这个问题。尽管这一直很有趣,但双方都没有对SO的整体健康做出贡献。Mods已经清理了两次评论。我怀疑第三次访问可能会导致暂时停职