1
ALTER PROCEDURE [dbo].[Update_MCR]
     @xmlString  ntext
    ,@Message nvarchar(500) output
AS
BEGIN

    SET NOCOUNT ON;
    declare  @SL int,@Basic  float, @Grad_pay  float, @DA  float, @HRA  float, @MA  float, @Ptax  float, @Itax  float, @pf  float, @LIC  float, @Month_Of  datetime
    Declare @intDoc1 as int
    BEGIN TRANSACTION 
    print @xmlString
    exec sp_xml_preparedocument @intDoc1 OUTPUT, @xmlString
    declare Generate_Rq CURSOR FOR
    SELECT SL,Basic, Grad_pay, DA, HRA, MA, Ptax, Itax, pf, LIC,  Month_Of
    FROM OPENXML (@intDoc1,'/Salary/TransactionSalary',1)
    WITH ( SL int,Basic  float, Grad_pay  float, DA  float, HRA  float, MA  float, Ptax  float, Itax  float, pf  float, LIC  float, Month_Of  datetime)

    OPEN Generate_Rq

    FETCH next FROM Generate_Rq
    INTO @SL,@Basic, @Grad_pay, @DA, @HRA, @MA, @Ptax, @Itax, @pf, @LIC,  @Month_Of

    WHILE @@Fetch_Status<>-1
        BEGIN
            Print 'Line  ' +@Basic+ '    '+ @Grad_pay+ '    '+ @DA+ '    '+ @HRA+ '    '+ @MA+ '    '+ @Ptax+ '    '+ @Itax+ '    '+ @pf+ '    '+ @Month_Of+ '    '+ @LIC+ '    '+ @SL

            UPDATE  [Monthly_Salary_Statement]  
            Set [Basic]=@Basic, [Grad_pay]=@Grad_pay, [DA]=@DA, [HRA]=@HRA, [MA]=@MA, [Ptax]=@Ptax, [Itax]=@Itax, [pf]=@pf,  [LIC]=@LIC
            Where  [SL]=@SL and month([Month_Of])=month(@Month_Of) and year([Month_Of])=year(@Month_Of)

            if(@@ERROR<>0)
                BEGIN
                    rollback transaction
                    Set @Message='sp_Update_Montly_Salary: ' + @@Error 
                    close Generate_Rq
                    deallocate Generate_Rq
                    Return
                END
            FETCH next FROM Generate_Rq
            INTO @SL,@Basic, @Grad_pay, @DA, @HRA, @MA, @Ptax, @Itax, @pf, @LIC,  @Month_Of
        END
    CLOSE Generate_Rq
    DEALLOCATE Generate_Rq
    COMMIT TRANSACTION
    set  @Message='True'
END

サンプル XML:

<Salary>
  <TransactionSalary SL="8" Basic="12560.00" Grad_pay="4800.00" DA="7812.00" HRA="2604.00" MA="300.00" Ptax="150.00" pf="2000.00" Itax="200.00" LIC="0.00" Month_Of="20-Dec-2012" /> 
  <TransactionSalary SL="7" Basic="9860.00" Grad_pay="4100.00" DA="6282.00" HRA="2094.00" MA="300.00" Ptax="150.00" pf="2000.00" Itax="0.00" LIC="0.00" Month_Of="20-Dec-2012" /> 
  <TransactionSalary SL="9" Basic="11850.00" Grad_pay="4800.00" DA="7493.00" HRA="2498.00" MA="300.00" Ptax="150.00" pf="2000.00" Itax="0.00" LIC="200.00" Month_Of="20-Dec-2012" /> 
  </Salary>'

エラー:

メッセージ 8115、レベル 16、状態 8、プロシージャ Update_MCR、行 42
10 進数をデータ型数値に変換する算術オーバーフロー エラー。

このエラーが発生する理由とその値を見つけることができません。挿入の場合は、このサイトに記載されている別の方法をとります。しかし、再び同じ問題に直面します。

4

1 に答える 1

2

私は...するだろう:

  • のデータ型を@xmlStringに変更しXMLます - 結局のところ、XML です - ですよね?
  • カーソルを取り除く!あなたはそれを必要としません - それはただのパフォーマンスキラーです - ドロップしてください
  • 「古いスタイル」のものを取り除き、OPENXMLSQL Server のネイティブ XQuery サポートを使用してください。はるかに使いやすい

したがって、私の手順は次のようになります。

ALTER PROCEDURE [dbo].[Update_MCR]
     @xmlString  XML,
     @Message nvarchar(500) output
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRY
        BEGIN TRANSACTION 

        ;WITH trsal AS 
        (
            SELECT
                SL = TrSal.value('@SL', 'int'),
                [Basic] = TrSal.value('@Basic', 'decimal(16,2)'),
                [Grad_Pay] = TrSal.value('@Grad_pay', 'decimal(16,2)'),
                [DA] = TrSal.value('@DA', 'decimal(16,2)'),
                [HRA] = TrSal.value('@HRA', 'decimal(16,2)'),
                [MA] = TrSal.value('@MA', 'decimal(16,2)'),
                [Ptax] = TrSal.value('@Ptax', 'decimal(16,2)'),
                [Itax] = TrSal.value('@Itax', 'decimal(16,2)'),
                [pf] = TrSal.value('@pf', 'decimal(16,2)'),
                [LIC] = TrSal.value('@LIC', 'decimal(16,2)'),
                [Month_Of] = TrSal.value('@Month_Of', 'datetime')
             FROM 
                @XmlString.nodes('/Salary/TransactionSalary') AS XTbl(TrSal)    
        )
        UPDATE [Monthly_Salary_Statement]  
        SET 
        [Basic] = trsal.Basic, 
        [Grad_pay] = trsal.Grad_pay, 
        [DA] = trsal.DA, 
        [HRA] = trsal.HRA, 
        [MA] = trsal.MA, 
        [Ptax] = trsal.Ptax, 
        [Itax] = trsal.Itax, 
        [pf] = trsal.pf, 
        [LIC] = trsal.LIC
        FROM
        trsal        
        WHERE
        [SL] = trsal.SL 
        AND MONTH([Month_Of]) = MONTH(trsal.Month_Of) 
        AND YEAR([Month_Of]) = YEAR(trsal.Month_Of)

      COMMIT TRANSACTION

      SET @Message = 'True'

    END TRY
    BEGIN CATCH
       ROLLBACK TRANSACTION

       SET @Message = 'sp_Update_Montly_Salary: ' + ERROR_MESSAGE()
    END
END
于 2012-12-20T10:54:14.960 に答える