Sql 使用存储过程借贷

Sql 使用存储过程借贷,sql,sql-server,Sql,Sql Server,我正在尝试使用存储过程进行借记和贷记,并更新帐户余额 我的SQL代码如下所示 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 = @

我正在尝试使用存储过程进行借记和贷记,并更新帐户余额

我的SQL代码如下所示

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
现在要运行存储过程,请执行以下操作:

EXEC DebitCr
@AccountNumber1 = '0023889098',
@AccountNumber2 = '0023889133',
@balance = 165000,
@amount = 15000

由于某些原因,它没有有效地更新帐户余额,我到底得到了什么错误?

您需要将参数更改为列名称,如下所示,在Update语句中

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

要处理
null
值,您可以使用
ISNULL

null
值导致以下问题:

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

我不明白为什么要将余额传递到存储过程中。它存储在表中。我认为数量是唯一需要的:

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
也就是说,您可能想考虑如何使程序“安全”。以下是一些想法:

  • 要么在一条语句中进行更新,要么将其包装在一个事务中,这样它们“同时”生效
  • 在更改任何值之前,请检查这两个帐户是否有效
  • 在更改任何值之前,请检查第一个帐户的余额是否足够大

根据实际业务需求,可能还需要进行其他检查。

好的,谢谢您的提醒。我遵循了@Suraj Kumar和Gordon Linoff所说的内容,现在扣除罚款。谢谢大家

借记卡贷记的SQL源代码如下所示:

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
现在我做了这样的事情:

EXEC DebitCr
@AccountNumber1 = '0023889098',
@AccountNumber2 = '0023889133',
@amount = 15000

很好,再次感谢。

在做任何事情之前,你需要
凝聚(@balance,0),凝聚(@amount,0)
。停下来先想想。您的过程没有理由接受任何空参数值。相反,您的过程应该直接或通过受影响表上的约束拒绝空值。不要鼓励懒惰的编码,也不要向没有提供正确信息的过程用户隐瞒错误。@SMor,实际上我今天开始学习存储过程。再次感谢。我认为where条件下的where'@AccountNumber1'=@AccountNumber1';左边应该是AccountNumber1,而不是“@AccountNumber1”。不减去借方和贷方。一切都还是原来的样子same@SurajKumar . . . 非常感谢。