-4
ALTER PROCEDURE [dbo].[sp_Insert_Monthly_Salary_Req]
     @xmlString  ntext
    ,@Message nvarchar(500) output
AS
BEGIN

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

    OPEN Generate_Rq
    FETCH next FROM Generate_Rq
    INTO @Emp_SL,@Basic, @Grad_pay, @DA, @HRA, @MA, @Ptax, @Itax, @pf, @LIC,  @Month_Of
    print 'Line2'
    WHILE @@Fetch_Status<>-1
        BEGIN
            Print 'Line  ' +@Basic+ '    '+ @Grad_pay+ '    '+ @DA+ '    '+ @HRA+ '    '+ @MA+ '    '+ @Ptax+ '    '+ @Itax+ '    '+ @pf+ '    '+ @Month_Of+ '    '+ @LIC+ '    '+ @Emp_SL

            INSERT INTO [Monthly_Salary_Statement]([Basic], [Grad_pay], [DA], [HRA], [MA], [Ptax], [Itax], [pf], [Month_Of], [LIC], [Emp_SL])
            VALUES (@Emp_SL,@Basic, @Grad_pay, @DA, @HRA, @MA, @Ptax, @Itax, @pf, @LIC,  @Month_Of)
            if(@@ERROR<>0)
                BEGIN
                    rollback transaction
                    Set @Message='sp_Insert_PromtList: ' + @@Error 
                    close Generate_Rq
                    deallocate Generate_Rq
                    Return
                END
            FETCH next FROM Generate_Rq
            INTO @Emp_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

<Salaray>
  <TransactionSalary EmpSL="2" Basic="9860" Grad_pay="4100.00" DA="6282.00" HRA="2094" MA="300.00" Ptax="150.00" pf="2000" Itax="0.00" LIC="0.00" Month_Of="14/Dec/2012" /> 
  <TransactionSalary EmpSL="1" Basic="12560" Grad_pay="4800.00" DA="7812.00" HRA="2604.00" MA="300" Ptax="150.00" pf="2000" Itax="0.00" LIC="0.00" Month_Of="14/Dec/2012" /> 
  <TransactionSalary EmpSL="4" Basic="11850" Grad_pay="4800.00" DA="7493.00" HRA="2498.00" MA="300" Ptax="150.00" pf="2000" Itax="0.00" LIC="0.00" Month_Of="14/Dec/2012" /> 
  </Salaray>',

それが示している ..

メッセージ 8115、レベル 16、状態 8、プロシージャ sp_Insert_Monthly_Salary_Req、行 26
nvarchar をデータ型数値に変換する算術オーバーフロー エラー。
メッセージ 16917、レベル 16、状態 2、プロシージャ sp_Insert_Monthly_Salary_Req、行 27
カーソルが開いていません。
メッセージ 16917、レベル 16、状態 1、プロシージャ sp_Insert_Monthly_Salary_Req、行 47
カーソルが開いていません。

4

1 に答える 1

2

入力XMLが与えられたら、この単純なXQueryステートメントを使用して、XMLをリレーショナル行と列に「細断処理」INSERT INTO .....できます。単純な操作を行うだけで完了です。面倒なカーソルもOPENXML必要なものもありません...

DECLARE @input XML = '<Salaray>
  <TransactionSalary 
    EmpSL="2" Basic="9860" Grad_pay="4100.00" DA="6282.00" HRA="2094" MA="300.00" Ptax="150.00" pf="2000" 
    Itax="0.00" LIC="0.00" Month_Of="14/Dec/2012" /> 
  <TransactionSalary EmpSL="1" Basic="12560" Grad_pay="4800.00" DA="7812.00" HRA="2604.00" MA="300" Ptax="150.00" pf="2000" Itax="0.00" LIC="0.00" Month_Of="14/Dec/2012" /> 
  <TransactionSalary EmpSL="4" Basic="11850" Grad_pay="4800.00" DA="7493.00" HRA="2498.00" MA="300" Ptax="150.00" pf="2000" Itax="0.00" LIC="0.00" Month_Of="14/Dec/2012" /> 
  </Salaray>'

/* just add this INSERT INTO statement when you're confident the SELECT returns the right data! 
INSERT INTO [Monthly_Salary_Statement]([Emp_SL], [Basic], [Grad_pay], [DA], [HRA], [MA], [Ptax], [Itax], [pf],  [LIC], [Month_Of])
*/
 SELECT
    Emp_SL = XTbl.TSal.value('@EmpSL', 'int'),
    [Basic] = XTbl.TSal.value('@Basic', 'decimal(10,2)'),
    Grad_pay = XTbl.TSal.value('@Grad_pay', 'decimal(6,2)'),
    DA = XTbl.TSal.value('@DA', 'decimal(6,2)'),
    HRA = XTbl.TSal.value('@HRA', 'decimal(6,2)'),
    MA = XTbl.TSal.value('@MA', 'decimal(6,2)'),
    Ptax = XTbl.TSal.value('@Ptax', 'decimal(6,2)'),
    Itax = XTbl.TSal.value('@Itax', 'decimal(6,2)'),
    pf = XTbl.TSal.value('@pf', 'decimal(6,2)'),
    LIC = XTbl.TSal.value('@LIC', 'decimal(6,2)'),
    Month_Of = XTbl.TSal.value('@Month_Of', 'datetime')
  FROM
    @input.nodes('/Salaray/TransactionSalary') AS XTbl(TSal)

12560また、属性のような値がありBasicます-それらは-に収まりませんdecimal(6,2)-合計6桁で、そのうちの2つはコンマの後にあります-これはまた、コンマのに4桁しかない-を保持するのに十分ではありません12560。私はdecimal(10,2)代わりに使用しました-それは機能します。

次の出力が表示されます:

ここに画像の説明を入力してください

于 2012-12-14T16:18:25.127 に答える