我有一个存储过程,该过程在我的本地环境以及QA环境中正常工作。
但是,在客户端的UAT环境中,它给出了错误
system.data.sqlclient.sqlexception:
消息号=" 8115"严重=" 16"状态=" 8">算术溢出错误 将nvarchar转换为数据类型数字。
它在客户位置中安装的本地实例之一中也可以正常工作。我找到了代码行,该行通过评论/UMCOMEMMEMTING LINES,并将其归零至
(
@TotalHHInternalTo IS NULL
OR
(
IsNumeric(E.[Xml].value(
'declare default element namespace "http://www.xyz/1.0";
(/Event/Data/CustomData/DataXML/ProductData/ProductParty/ProductCategory[@code != ''Protection'']/Product/FundValue)[1]',
'nvarchar(50)'
) ) = 1
AND
EXISTS
(
SELECT
1
FROM E.[Xml].nodes(
'declare default element namespace "http://www.xyz/1.0";
/Event/Data/CustomData/DataXML/ProductData/ProductParty/ProductCategory[@code != ''Protection'']/Product') as P(E)
HAVING SUM(P.E.value(
'declare default element namespace "http://www.xyz/1.0";
(FundValue)[1]',
'decimal'
)) <= @TotalHHInternalTo
)
)
)
变量@TotalHHInternalTo
是类型十进制的参数,是搜索标准的一部分,以XML传递到存储过程。在产品团体下,我有4个产品类别,除了类型保护外,我需要总计所有资金价值。如果这三种类型的总和小于@TotalHHInternalTo
,我想在搜索结果中显示。
我添加了isNumeric
条件,以检查从XML拾取的值是否是数字值。
但是,我仍然遇到溢出错误。
检查我的括号,但是您需要将其转换为使用情况下的明确短路布尔评估。SQL Server可以免费评估AND
条件的任何顺序,并且您的杆端错误。
CASE WHEN IsNumeric(E.[Xml].value(
'declare default element namespace "http://www.focus-solutions.co.uk/focus360/1.0";
(/Event/Data/CustomData/DataXML/ProductData/ProductParty/ProductCategory[@code != ''Protection'']/Product/FundValue)[1]',
'nvarchar(50)'
) ) = 0
THEN 0
WHEN
EXISTS
(
SELECT
1
FROM E.[Xml].nodes(
'declare default element namespace "http://www.focus-solutions.co.uk/focus360/1.0";
/Event/Data/CustomData/DataXML/ProductData/ProductParty/ProductCategory[@code != ''Protection'']/Product') as P(E)
HAVING SUM(P.E.value(
'declare default element namespace "http://www.focus-solutions.co.uk/focus360/1.0";
(FundValue)[1]',
'decimal'
)) <= @TotalHHInternalTo
)
THEN 1
ELSE 0 END = 1