我有一个存储过程,可以在我的本地环境以及QA环境中正常工作。
然而,在客户端的UAT环境中,它会给出错误
System.Data.SqlClient.SqlException:
消息号=“8115”severity =“16”state =“8”>算术溢出错误 将nvarchar转换为数据类型numeric。
它也适用于客户端位置中安装的一个本地实例。 我发现了一行代码,它通过注释/ umcommenting代码行将错误归结为
(
@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个产品类别,除了类型保护之外,我需要总计所有基金价值。如果这3种类型的总和小于@TotalHHInternalTo
,我想在搜索结果中显示它。
我添加了isNumeric
条件,以检查从xml中获取的值是否为数值。
但是我仍然遇到溢出错误。
答案 0 :(得分:1)
检查我的括号,但您需要使用CASE将其转换为显式短路布尔评估。 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