gpt4 book ai didi

sql-server - SQL Server 2008 - 插入触发器 : How to add values not in Inserted pseudo table

转载 作者:行者123 更新时间:2023-12-04 01:57:45 24 4
gpt4 key购买 nike

设置

我正在尝试为小型企业编写一个非常简单的复式记账系统。它对我的个人训练比什么都重要。

我有两个表,TransactionsDebitCredits :

    [dbo].[Transactions](
[TransactionId] [int] IDENTITY(1,1) NOT NULL,
[TransactionDate] [date] NOT NULL,
[IdFrom] [int] NOT NULL,
[IdTo] [int] NOT NULL,
[Amount] [decimal](18, 2) NOT NULL,
[IdCostCentre] [int] NOT NULL,
[IdCurrency] [int] NOT NULL)

...哪里IdFromIdToAccounts 的 FK包含每个帐户详细信息的表。 From 和 To 指的是资金流入的方向。即从 From 取钱给 To。

[dbo].[DebitCredits](
[DebitCreditId] [int] IDENTITY(1,1) NOT NULL,
[TransactionDate] [date] NOT NULL,
[IdAccount] [int] NOT NULL,
[Amount] [money] NOT NULL,
[DorC] [char](1) NOT NULL)

我想要的:

当一行被插入到 Transactions 中时(来自 MVC 3 网站),我想要一个触发器将两行插入到 DebitCredits 中:

交易行:

1, 01/01/2012, 33, 44, 300, 2, 1

...哪里1TransactionId ,日期为日期,33From Account id To 是 To Account Id . 300是数量,2是 CostCentres 表的 FK 和 1是货币(例如,阿根廷比索)。

DebitCredits 行:

3, 01/01/2012, 33, -300, "D"
4, 01/01/2012, 44, 300, "C"

问题:

我不知道如何在 T-SQL 中表达我需要的两个插入语句。我可以插入从 Transactions 获得的值行,但我不能:

  1. 改签金额(300)
  2. 我不知道如何设置 DorC(借方或贷方)列的值,即“D”或“C”,具体取决于 IdFromIdTo Transactions 中的列表。

我要去的地方:

ALTER TRIGGER [dbo].[tgInsertDebitCreditRows] ON [dbo].[Transactions]
FOR INSERT
AS
INSERT INTO DebitCredits
(IdTransaction, TransactionDate, IdAccount, Amount, DorC)
SELECT
TransactionId, TransactionDate, IdFrom, Amount, "C"
FROM inserted

INSERT INTO DebitCredits
(IdTransaction, TransactionDate, IdAccount, Amount, DorC)
SELECT
TransactionId, TransactionDate, IdTo, Amount, "C"
FROM inserted

显然,这失败了,因为 SQL Server 不“知道”列“C”和“D”。这些不是列,它们只是我想要插入的(表达愿望)值。

而且在这两种情况下金额都是 300,而不是 -300 和 300。

有什么指点吗? (不用说,我一生中从未写过触发器……更多的是真正的 Web 开发人员)。

最佳答案

我认为你非常接近,实际上!

  • 显然,这会失败,因为 SQL Server 不“知道”列“C”和“D”。

好吧,您需要使用 'C''D'(单引号)作为字符串文字 - 这样就可以了。

  • 而且在这两种情况下金额都是 300,而不是 -300 和 300。

没问题 - 只需将其中一个金额乘以 -1 即可“切换”其符号。

ALTER TRIGGER [dbo].[tgInsertDebitCreditRows] ON [dbo].[Transactions]
FOR INSERT
AS
INSERT INTO dbo.DebitCredits
(IdTransaction, TransactionDate, IdAccount, Amount, DorC)
SELECT
TransactionId, TransactionDate, IdFrom, Amount, 'C'
FROM inserted

INSERT INTO dbo.DebitCredits
(IdTransaction, TransactionDate, IdAccount, Amount, DorC)
SELECT
TransactionId, TransactionDate, IdTo, -1.0 * Amount, 'D'
FROM inserted

关于sql-server - SQL Server 2008 - 插入触发器 : How to add values not in Inserted pseudo table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6706483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com