【问题标题】:SQL update trigger unable to handle multiple entriesSQL 更新触发器无法处理多个条目
【发布时间】:2016-04-18 21:08:39
【问题描述】:

我有一个 SQL MERGE 脚本,用于更新存在更新触发器的表。 当 MERGE 脚本只对表进行一次更新时,触发器可以正常工作。当 MERGE 命令对表进行多次更新时,触发器会返回错误。 这是触发器:

ALTER TRIGGER [dbo].[userupd] 
ON  [dbo].[users] 
AFTER UPDATE
AS 
BEGIN
        SET NOCOUNT ON;

DECLARE @navn varchar(255), @fornavn varchar(255), @efternavn varchar(255),@initialer varchar(255), @areagroups varchar(255)

SET @fornavn = (SELECT Fornavn FROM DELETED)
SET @efternavn = (SELECT Efternavn FROM DELETED)
SET @initialer = (SELECT Initialer FROM DELETED)
IF  @initialer IS NULL SET @initialer = 'Extern'
SET @navn = @fornavn + ' ' + @efternavn + ' (' + @initialer + ')'
SET @areagroups = (SELECT AddedAreaGroups FROM NOX.dbo.simscodesusers WHERE Username = @navn)
SELECT @areagroups OriginalString, RTRIM(LTRIM(@areagroups)) TrimmedValue
SET @areagroups = ' ' + @areagroups

INSERT  INTO NOX.dbo.SIMScodesAutoUpdate
    ( Action ,
      Username
    )
    SELECT  'DELETE' ,
            D.Fornavn + ' ' + D.Efternavn + ' (' + D.Initialer + ')'
    FROM    DELETED D;               

INSERT  INTO NOX.dbo.SIMScodesAutoUpdate
    ( Action ,
      Username ,
      NoxAutoCode ,
      NoxAutoCodePIN ,
      UserGroup ,
      Startdate ,
      EndDate ,
      AddedAreaGroups
    )
    SELECT  'ADD' ,
            I.Fornavn + ' ' + I.Efternavn + ' (' + I.Initialer + ')' ,
            I.Kortnummer ,
            I.PINkode ,
            I.Brugerniveau ,
            I.Startdato ,
            I.Slutdato,
            @areagroups
    FROM    INSERTED I

END

这是包含 MERGE 脚本的 SQL 作业返回的错误:

Executed as user: CPCORP\SQDKRTV96service. Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. [SQLSTATE 21000] (Error 512) The statement has been terminated. [SQLSTATE 01000] (Error 3621). 步骤失败。

可以编辑触发器以处理多个值吗?

提前致谢。

【问题讨论】:

  • 也许吧。第一个问题是:当某人是多个组的成员时会发生什么?

标签: sql sql-server tsql


【解决方案1】:

在第二种情况下(“当 MERGE 命令带有多个更新时......”)DELETED 表包含许多行。因此,您不能将 MULTI rows 表分配给 ONE SCALAR 变量。以下是错误“子查询返回超过 1 个值...”的来源:

SET @fornavn = (SELECT Fornavn FROM DELETED)

Microsoft: Create DML Triggers to Handle Multiple Rows of Data

【讨论】:

    猜你喜欢
    • 2013-12-11
    • 2018-05-24
    • 2012-01-08
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2018-04-15
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多