0

我有一个存储过程,可以在我的本地环境和 QA 环境中正常工作。

但是在客户端的 UAT 环境中,它会给出错误

System.Data.SqlClient.SqlException:
Message number="8115" severity="16" state="8">将 nvarchar 转换为数据类型 numeric 的算术溢出错误。

它在安装在客户端位置的本地实例之一中也可以正常工作。我通过注释/取消注释代码行找到了给出错误的代码行并将其归零为

(
        @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 中提取的值是否为数值。

但是我仍然收到溢出错误。

4

1 回答 1

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
于 2012-10-29T12:07:00.880 回答