2015-04-14 38 views
0

我在sql server 2005中創建一個udf返回一個表,我在udf中使用這個表來計算客戶端的solde,但有時結果是正確的,有時是不正確的(錯誤值是在字段 「Solde」)在表達@ Solde = @Solde + @Debit - @Creditsql server 2005函數計算結果錯誤

這是函數的代碼:

CREATE FUNCTION HistoryClient 
(
    @IdClient  int 
) 
RETURNS @Table_Var 
    TABLE (NAuto  BigInt Identity(1,1), 
      Numero  nvarchar(20), 
      Ligne  nvarchar(50), 
      IdClient int, 
      Matricule nvarchar(30), 
      DateBL  datetime, 
      Libelle  nvarchar(50), 
      Qte   decimal(18, 2), 
      PU   money, 
      Debit  money, 
      Credit  money, 
      Solde  money 
     ) 
AS 
BEGIN 

    Declare @SoldeInitial money 

    DECLARE @Debit  money 
    DECLARE @Credit  money 
    DECLARE @Solde  money 
    DECLARE @Solde1  money 
    DECLARE @Ligne  nvarchar(50) 

    DECLARE History_Cursor CURSOR FOR 
    SELECT Ligne, Debit, Credit, Solde 
    FROM @Table_Var 
    FOR UPDATE OF Solde 


    Select @SoldeInitial = SoldeInitial 
    From Client 
    Where IdClient= @IdClient 


    INSERT INTO @table_Var (Numero, Ligne, IdClient, Matricule, DateBL, Libelle, Qte, PU, Debit, Credit, Solde) 
    Select Numero, Ligne, IdClient, Matricule, DateBL, Libelle, Qte, PU, Debit, Credit, 0 
    From vwHistoryAllClients 
    Where IdClient= @IdClient 
    Order By Ligne 



    OPEN History_Cursor 
    FETCH NEXT FROM History_Cursor Into @Ligne, @Debit, @Credit, @Solde1 
    SET @Solde = @SoldeInitial 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     SET @Solde= @Solde + @Debit - @Credit 

     UPDATE @Table_Var 
     SET Solde = @Solde 
     WHERE CURRENT Of History_Cursor 
     FETCH NEXT FROM History_Cursor Into @Ligne, @Debit, @Credit, @Solde1 
    END 
    CLOSE History_Cursor 
    DEALLOCATE History_Cursor 


RETURN 
END 

任何溶液

+2

是否有錯誤或錯誤的值?你的數據是否包含NULL值? –

+0

在n行之後solde值不正確,開始時solde值正確,我的數據不包含空值我使用isnull,但有些結果 – ghostdz

回答

0

SELECT聲明在的定義中210沒有ORDER BY子句。這意味着不能保證從遊標返回行的順序。

從我收集的內容中,您試圖計算Solde列中的運行總和。但是,由於您的CURSOR定義中沒有ORDER BY Ligne,因此不能保證Solde將成爲Ligne訂單後的運行總和。也許這會導致你得出結論:有時結果是正確的,有時不是。

但是,唉,在CURSOR聲明中添加ORDER BY子句使其成爲READ ONLY。關於原因是什麼,請參閱following Stackoverflow thread

如果實際上您需要計算Solde列中的(Credit-Debit)的運行總和,請參閱following Stackoverflow thread關於計算SQL Server中的運行總和。

+0

當我添加ORDER BY Ligne時,我在執行時出現消息錯誤「cursor是隻讀的「 – ghostdz

+0

@ghostdz可能添加ORDER BY子句使得CURSOR只讀。如果實際上您打算計算Solde列中的(Credit-Debit)的運行總和,請參閱此[StackOverflow線程](http://stackoverflow.com/questions/860966/calculate-a-running-total-在-SQLSERVER)。 –

+0

@ghostdz我會更新我的答案以反映這個問題。 –