2016-04-18 13 views
2

更新トリガーが存在するテーブルを更新するSQL MERGEスクリプトがあります。 MERGEスクリプトにテーブルへの更新が1つしかない場合、トリガーは正常に動作します。 MERGEコマンドに複数のテーブル更新があると、トリガーはエラーを返します。ここ はトリガーです:複数のエントリを処理できないSQL更新トリガー

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).ステップが失敗しました。

トリガーを編集して複数の値を処理できますか?

ありがとうございます。

+1

:ここでは、エラーの原因である「サブクエリは複数の値を....返さ」。最初の質問は、誰かが多くのグループのメンバーであるときはどうなりますか? –

答えて

4

2番目のケース(「MERGEコマンドに複数の更新が含まれる場合...」)では、DELETEDテーブルには多数の行が含まれています。したがって、ONE SCALAR変数にMULTI行テーブルを割り当てることはできません。たぶん

SET @fornavn = (SELECT Fornavn FROM DELETED) 

Microsoft: Create DML Triggers to Handle Multiple Rows of Data

関連する問題