2012-12-14 23 views
-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 ' [email protected]+ ' '+ @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
遊標未打開。

+2

* Salaray * - 真的嗎?這是一種新的魚類嗎?另外:避免爲存儲過程使用'sp_'前綴 - 它由Microsoft保留並導致性能下降。最後:爲什麼你在使用**光標**這個? –

+1

你猜如何?「將nvarchar轉換爲數據類型數值的算術溢出錯誤。」也許意味着? – AakashM

+1

錯誤似乎非常清楚:某處「NVARCHAR」值無法轉換爲「NUMERIC」。你是否瀏覽過你的代碼來確定可能發生的事情? – Pondlife

回答

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)而不是 - 這是有效的。

給我的輸出:

enter image description here

相關問題