【问题标题】:SQL Server - Trigger on insert with counterSQL Server - 使用计数器触发插入
【发布时间】:2019-01-10 10:47:54
【问题描述】:

我有以下两张表:

  • ITEMS (ID | CODE | NAME):项目被添加到表 items 并根据计数器表分配一个新代码

  • COUNTERS(ID | YEAR | COUNTER):每年有一行,每年增加一个新行并将计数器设置为零。

我想在每次插入新项目时增加当年的计数器,并在当前项目的代码列分配格式化的计数器。

例子:

  • 插入了一个新项目:ID=34, CODE=null, NAME=productName
  • 当前年份的计数器递增:ID=1, YEAR=2019, COUNTER=34
  • 计数器值分配给代码列:ID=34, CODE=CE201934, NAME=productName

如何创建执行此任务的触发器?如果当前年份发生变化,触发器必须在计数器表上添加一个新行。

【问题讨论】:

  • 我认为您可以在插入表项时创建触发器。因为您必须检查今年的 COUNTERS 是否存在,否则插入并更新计数器。我认为使用计数器的更好方法是使用序列。对于触发器,请使用此文档:docs.microsoft.com/fr-fr/sql/t-sql/statements/…
  • 删除项目后会发生什么?并仔细考虑您的生成逻辑。您选择将此值存储为字符串。它将如何使用?您是否打算根据这些值进行比较或排序。因为项目 #2 将是 CE20192,项目 #1000 将是 CE20191000。如果你对它们进行排序,哪一个在前?

标签: sql-server concurrency triggers


【解决方案1】:
    INSERT INTO ITEMS(ID,CODE,NAME)
    VALUES(34,NULL,'ProductName')

    DECLARE @ID INT = SCOPE_IDENTITY();

    IF NOT EXISTS(SELECT * FROM Counters WHERE ID = @ID AND [Year] = YEAR(GETDATE())) 
    BEGIN 
    INSERT INTO Counters
    (
       ID
       ,Year
       ,Counter
    )
    VALUES(@ID,YEAR(GETDATE()),SELECT MAX(Counter)+1 FROM Counters WHERE ID = @ID AND [Year] = YEAR(GETDATE()))
    END

DECLARE @Code BIGINT = SCOPE_IDENTITY();

UPDATE ITEMS
SET Code = @Code
WHERE ID = @ID

【讨论】:

    猜你喜欢
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多