0

ローカル環境と QA 環境で問題なく動作するストアド プロシージャがあります。

ただし、クライアントの UAT 環境ではエラーが発生します

System.Data.SqlClient.SqlException:
メッセージ番号="8115" 重大度="16" 状態="8">nvarchar を数値データ型に変換する算術オーバーフロー エラー。

また、クライアントの場所にインストールされたローカル インスタンスの 1 つで正常に動作します。コード行にコメント/コメントを付けることでエラーを引き起こすコード行を見つけ、それをゼロにしました

(
        @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 としてストアド プロシージャに渡される検索基準の一部である decimal 型のパラメーターです。Product party の下に 4 つの製品カテゴリがあり、タイプ Protection を除くすべての Fund 値を合計する必要があります。これら 3 つのタイプの合計が少ない場合 @TotalHHInternalToは、検索結果に表示したいと思います。

isNumericxml から取得した値が数値かどうかをチェックする条件を追加しました。

ただし、まだオーバーフロー エラーが発生します。

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 に答える