【问题标题】:Is there a way to Re update the table in SQL after the data is inserted in MS sql?有没有办法在MS sql中插入数据后重新更新SQL中的表?
【发布时间】:2017-06-15 18:08:31
【问题描述】:

我想通过添加相同账单 ID 的金额并从 Duedate 中提取最早日期来更新表 CustBill

这是插入数据后的表

Bill ID    Amount   CUstName   Duedate    
12         12.2     ABC        12222016
12         22.2     ABC        12112016
13         23.22    ABC        12102016

这就是我的表格在插入数据后应该如何更新

Bill ID    Amount   CUstName   Duedate
12         34.4     ABC        12112016
13         23.22    ABC        12102016

如何做到这一点?

【问题讨论】:

  • 插入dba.stackexchange.com/questions/39970/…后可以用google搜索触发器
  • 你的目标并不完全清楚。目标是汇总插入的任何内容吗?你是怎么想出DueDate的?如果第一个条目允许在 12 月 22 日付款,为什么它应该是最早的 DueDate?
  • 如果 bill_id 12 的两行有不同的 DueDates,为什么要聚合它们?
  • @linkin 但是为什么呢?从财务角度来看,这没有意义
  • 我不确定您的确切要求,但如果是我这样做,我不想丢失个人记录。相反,我会创建一个聚合组件的视图,例如CREATE VIEW dbo.SomeView AS SELECT BillID, SUM(Amount) AS Amount, CUstName, MIN(DueDate) AS Duedate FROM SomeTable GROUP BY BillID, CustName;。这样,如果您对如何到达某个到期日期或金额有任何困惑,您就有原始记录来帮助您调试。

标签: sql sql-server stored-procedures ssms


【解决方案1】:

像这样使用After INSERT Trigger

CREATE TRIGGER [dbo].[myUpdateTriggerAfterInsert]
ON  [dbo].[myTable]
AFTER INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @DueDate as Datetime;
DECLARE @CUstName as varchar(max);
DECLARE @Amount as decimal(15,0);
DECLARE @BillId as int;

SET @BillId = (SELECT [Bill Id] FROM inserted);
SET @DueDate = (SELECT TOP 1 [Duedate] FROM [dbo].[myTable] WHERE [Bill Id] = @BillId ORDER BY [Duedate] ASC);
SET @CUstName = (SELECT [CUstName] FROM inserted);
SET @Amount = (SELECT SUM([Amount]) FROM [dbo].[myTable] WHERE [Bill Id] = @BillId GROUP BY [Bill Id]);

IF (SELECT COUNT(*) FROM [dbo].[myTable] WHERE [Bill Id] = @BillId) > 1
BEGIN
  DELETE FROM [dbo].[myTable] WHERE [Bill Id] = @BillId;
  INSERT INTO [dbo].[myTable] ([Bill Id], [CUstName], [Amount], [DueDate])
    VALUES (@BillId, @CUstName, @Amount, @DueDate);
END
END

还要确保CUstName 对于给定的Bill Id 始终相同,否则您可能会丢失信息。

【讨论】:

  • 感谢您的帮助,在执行 INSERT INTO mytable 后,我已将您的解决方案添加到存储过程中,但出现此错误 - 当子查询遵循 =、!=、, >= 或当子查询用作表达式时。错误 #1 消息:语句已终止。
  • 尝试以下句子,然后逐句检查其余答案以找出您的问题。 DECLARE @DueDate as Datetime; DECLARE @CUstName as varchar(max); DECLARE @Amount as decimal(15,0); DECLARE @BillId as int; SET @BillId = 123; SET @DueDate = 12/06/2017; SET @CUstName = 'customer'; SET @Amount = 20.0; IF 2 > 1 BEGIN;SELECT 1;END
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多