2013-04-28 2 views
1

La base de données sur laquelle je travaille a le déclencheur d'insertion suivant. Le problème est que le déclencheur ne fonctionnera pas avec une insertion à plusieurs rangées. Lorsque j'essaie d'insérer plus d'une ligne à la fois, le message suivant s'affiche.Déclencheur d'insertion T-SQL

Msg 512, Niveau 16, État 1, Procédure _ti_UD06, Ligne 8
sous-requête retourné plus de 1 valeur. Ce n'est pas autorisée lorsque follows =, la sous-requête ! =, <, < =,>,> = ou lorsque la sous-requête est utilisé comme une expression . Je pense que le problème est avec l'instruction suivante retournera plus d'une valeur lorsque plusieurs lignes sont insérées.

Comment faire pour que ce déclencheur d'insertion fonctionne avec plusieurs lignes?

IF(SELECT PROGRESS_RECID FROM inserted) IS NULL 

Il y a 2 colonnes dans la table, PROGRESS_RECID et PROGRESS_RECID_IDENT_. Je pense que est une colonne Identity pour SQL Server. Le PROGRESS_RECID_INDENT est utilisé par le serveur PROGRESS.

Si un nouvel enregistrement est inséré les contrôles de déclenchement pour voir si le PROGRESS_RECID est nulle et réglez-le sur la inserted.Identity

ALTER trigger [dbo].[_ti_UD06] ON [dbo].[UD06] for insert as 
begin 
if (select PROGRESS_RECID from inserted) is NULL 
    begin 
     update t set PROGRESS_RECID = i.IDENTITYCOL 
     from UD06 t JOIN INSERTED i ON 
     t.PROGRESS_RECID_IDENT_ = i.PROGRESS_RECID_IDENT_ 
     select convert (bigint, @@identity) 
    end 
end 

Voici la définition du tableau

CREATE TABLE [dbo].[UD06](
[Company] [nvarchar](8) NULL, 
[Key1] [nvarchar](50) NOT NULL, 
[Key2] [nvarchar](50) NULL, 
[Key3] [nvarchar](50) NULL, 
[Key5] [nvarchar](50) NULL, 
[Character01] [nvarchar](max) NULL, 
[Character02] [nvarchar](max) NULL, 
[Character03] [nvarchar](max) NULL, 
[Character04] [nvarchar](max) NULL, 
[Character05] [nvarchar](max) NULL, 
[Character06] [nvarchar](max) NULL, 
[Character07] [nvarchar](max) NULL, 
[Character08] [nvarchar](max) NULL, 
[Character09] [nvarchar](max) NULL, 
[Character10] [nvarchar](max) NULL, 
[SysRowID] [nvarchar](36) NULL, 
[SysRevID] [int] NULL, 
[BitFlag] [int] NULL, 
[GlobalUD06] [tinyint] NULL, 
[GlobalLock] [tinyint] NULL, 
[PROGRESS_RECID] [bigint] NULL, 
[PROGRESS_RECID_IDENT_] [bigint] IDENTITY(1,1) NOT NULL 
) ON [PRIMARY] 

Répondre

1

Je pense que vous re assez proche déjà:

ALTER trigger [dbo].[_ti_UD06] ON [dbo].[UD06] for insert as 
begin 

    UPDATE t 
    SET PROGRESS_RECID = t.PROGRESS_RECID_IDENT_ --not "IDENTITYCOL" 
    FROM UD06 t 
    JOIN inserted i ON t.PROGRESS_RECID_IDENT_ = i.PROGRESS_RECID_IDENT_ 
    WHERE i.PROGRESS_RECID is Null 

    -- Not sure what this bit is for? I doubt it's a good idea though... 
    select convert (bigint, @@identity) 

end 
+0

J'ai fait les changements, je ne reçois plus l'erreur, mais le PROGRESS_RECID est nul après l'insertion. – Kevin

+0

@Kevin Nous aurions besoin de voir la définition de la table pour aller plus loin. – RBarryYoung

+0

Voici la définition du tableau. – Kevin