SQL 而不是触发器有时不触发?

标签 sql sql-server sql-server-2008 triggers

表事件有一个替代触发器,其目的是生成主键EventId为Max+1,其余列由insert填充。

EventId不是Identity,我们不能让它成为Identity,因为那里有很多依赖关系,触发逻辑:

SELECT TOP 1 @ID = Event.EventID FROM Event
IF (@ID IS NULL)
BEGIN
  SET @ID=1
END
ELSE
BEGIN
  SELECT @ID = MAX(Event.EventID) FROM Event
  SET @ID=@ID+1
END
--Then just a insert statment with this id as EventId and rest of the columns from inserted table

现在有时当我尝试插入到该表中时,它仍然说无法在 eventId 中插入重复项,不知道为什么会发生这种情况...

看起来触发器在某些情况下没有触发?为什么

最佳答案

您可能假设插入的伪表中只有一行,并且在发生多行插入时会失败。

你想要这样的东西:

;with maxID as (
    select MAX(EventID) as EventID from Event
), nrows as (
    select
        ROW_NUMBER() OVER (ORDER BY newid()) +
            COALESCE((select EventID from maxID),0) as EventID,
        /* columns from inserted table */
    from inserted
)
insert into Event (EventID,/* other columns */)
select EventID,/* other columns */
from nrows

关于SQL 而不是触发器有时不触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4759900/

相关文章:

sql - PLS-00201 : identifier 'CURSOR' must be declared

sql - 如何获得CTE结果的计数?

sql-server - 更新 SQL Server 中的 Select Case 语句 :

php - 错误 : Array to string conversion error

php - 是否可以用 PHP 代码连接两个查询结果?

c# - Azure Application Insights Analytics 加入查询

sql-server - SQL Server 中电话号码的限制

c# - SqlParameter 不允许表名 - 没有 sql 注入(inject)攻击的其他选项?

SQL 主键 - 复杂主键还是带有串联的字符串?

sql-server-2008 - 将 SQL Server 2012 Express 创建的数据库文件移动到 SQL Standard 2008