J'essaie d'effectuer un débit et un crédit en utilisant des procédures stockées et de mettre à jour les soldes de compte.
Mon code SQL ressemble à ceci
EXEC DebitCr @AccountNumber1 = '0023889098', @AccountNumber2 = '0023889133', @balance = 165000, @amount = 15000
Maintenant, pour exécuter la procédure stockée, je fais ceci:
ALTER PROCEDURE DebitCr @AccountNumber1 varchar(50) = null, @AccountNumber2 varchar(50) = null, @balance money = null, @amount money = null AS BEGIN SET NOCOUNT ON; UPDATE account_Balances SET @balance = @balance - @amount WHERE @AccountNumber1 = @AccountNumber1 UPDATE account_Balances SET @balance = @balance + @amount WHERE @AccountNumber2 = @AccountNumber2 END GO
Pour certaines raisons pour lesquelles il ne met pas à jour efficacement les soldes de compte, qu'est-ce que j'ai mal compris?
4 Réponses :
Vous devez changer le paramètre en nom de colonne comme indiqué ci-dessous dans l'instruction de mise à jour.
UPDATE account_Balances SET balance = ISNULL(@balance, 0) - ISNULL(@amount,0) WHERE AccountNumber1 = @AccountNumber1 UPDATE account_Balances SET balance = ISNULL(@balance, 0) + ISNULL(@amount,0) WHERE AccountNumber2 = @AccountNumber2
Pour gérer la valeur null , vous pouvez utiliser ISNULL code>.
Les valeurs
NULL causent les problèmes:
UPDATE account_Balances
SET balance = COALESCE(@balance, 0) - COALESCE(@amount, 0)
WHERE AccountNumber1 = @AccountNumber1
UPDATE account_Balances
SET balance = COALESCE(@balance, 0) + COALESCE(@amount, 0)
WHERE AccountNumber2 = @AccountNumber2
Je ne comprends pas pourquoi vous transmettez le solde à la procédure stockée. Il est stocké dans la table. Je pense que le montant est la seule chose nécessaire:
ALTER PROCEDURE DebitCr (
@AccountNumber1 varchar(50) = null,
@AccountNumber2 varchar(50) = null,
@amount money = null
) AS
BEGIN
SET NOCOUNT ON;
UPDATE account_Balances
SET balance = COALESCE(balance, 0) - COALESCE(@amount, 0)
WHERE AccountNumber = @AccountNumber1;
UPDATE account_Balances
SET balance = COALESCE(balance, 0) + COALESCE(@amount, 0)
WHERE AccountNumber = @AccountNumber2;
END;
GO
Cela dit, vous voudrez probablement réfléchir à la façon de rendre la procédure "sûre". Voici quelques idées:
solde suffisamment important avant de modifier les valeurs. D'autres contrôles peuvent également être nécessaires, en fonction des besoins réels de l'entreprise.
Je pense que la condition où est WHERE '@ AccountNumber1' = @ AccountNumber1 '; le côté gauche doit être AccountNumber1 et non "@ AccountNumber1".
Ne soustrait pas le débit et le crédit. Tout est toujours pareil
@SurajKumar. . . Je vous remercie!
Ok merci pour la mise en garde. J'ai suivi ce que @Suraj Kumar et Gordon Linoff ont dit et sa déduction est bien maintenant. Merci à tous
Le code source SQL pour le crédit de débit est donné ainsi:
EXEC DebitCr @AccountNumber1 = '0023889098', @AccountNumber2 = '0023889133', @amount = 15000
Maintenant, je fais quelque chose comme ceci:
ALTER PROCEDURE DebitCr (
@AccountNumber1 varchar(50) = null,
@AccountNumber2 varchar(50) = null,
@amount money = null
) AS
BEGIN
SET NOCOUNT ON;
UPDATE account_Balances
SET balance = COALESCE(balance, 0) - COALESCE(@amount, 0)
WHERE AccountNumber = @AccountNumber1;
UPDATE account_Balances
SET balance = COALESCE(balance, 0) + COALESCE(@amount, 0)
WHERE AccountNumber = @AccountNumber2;
END;
GO
Fonctionne bien, merci encore.
Vous avez besoin de
COALEACE (@balance, 0), COALESCE (@amount, 0)avant de faire quoi que ce soit.Arrêtez-vous et réfléchissez d'abord. Il n'y a aucune raison - ZERO - pour votre procédure d'accepter une valeur de paramètre nulle. Au contraire, votre procédure doit rejeter les valeurs nulles soit directement, soit via des contraintes sur la table affectée. N'encouragez pas le codage paresseux et ne cachez pas les erreurs des utilisateurs de procédures qui ne fournissent pas les informations correctes.
@SMor, en fait, j'ai commencé à apprendre les procédures stockées aujourd'hui. alors merci encore une fois.