2017-08-29 1 views
0

J'ai été googlé à propos de mon problème, mais je n'ai rien trouvé de pertinent.Insertion en bloc avec select et procédure - SQL Server

J'exécute une insertion en bloc avec l'indicateur FIRE_TRIGGERS activé. Donc, j'ai besoin de passer chaque ligne de mon insert en vrac à une procédure. Lorsque j'exécute une insertion ligne par ligne, mes déclencheurs fonctionnent correctement mais lorsque j'exécute une insertion en bloc mes déclencheurs ne fonctionnent pas.

Mon code de déclenchement:

ALTER TRIGGER [dbo].[tgSetDetails] 
    ON [PORTALSQLDB].[dbo].[BurnTimeRawData] 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @ServiceTag varchar(10); 
    DECLARE @Platform varchar(50); 

    SELECT 
     @ServiceTag = ServiceTag, 
     @Platform = Platform 
    FROM 
     inserted 

    EXEC spBurnTimeInsertData @ServiceTag, @Platform 
END 

Toute idée comment je peux faire ce travail?

Merci :)

+0

Quelqu'un a posé la question ici, pas sûr si la réponse est pertinente? https://stackoverflow.com/questions/17759718/bulk-insert-with-fire-triggers-not-execute-the-trigger Votre déclencheur ne peut gérer qu'un enregistrement, pas tous en même temps, donc cela pourrait être le problème. – Leonidas199x

+0

@ Leonidas199x ok, je sais que le déclencheur ne peut gérer qu'un seul enregistrement à la fois, ce que je peux faire à ce sujet? –

+0

Écrire une boucle pour le faire sur les données qui ont été insérées après l'insertion en vrac? – Leonidas199x

Répondre

0

Ce déclencheur se déclenche une fois pour chaque instruction d'insertion ou en vrac par lots d'insertion. Pour appeler un proc pour chaque ligne, vous aurez besoin d'un curseur.

Il serait préférable de refactoriser le code de proc comme une opération basée sur un ensemble à inclure dans le code de déclenchement. Cela fonctionnera beaucoup mieux.

+0

Ok, mais j'ai déjà essayé d'utiliser un curseur, mais ma table était bloquée et toute insertion était validée. Avez-vous un exemple pour moi? –

+0

Avoir un ** curseur ** à l'intérieur d'un ** déclencheur ** est probablement le pire péché de performance que vous pouvez avoir dans SQL Server. Un déclencheur doit être * très agile, petit, rapide * - il ne doit PAS faire de gros travaux ni de traitement extensif, car il fonctionne dans le contexte du code appelant qui a déclenché le déclenchement, et ce code a été gagné. t être en mesure de terminer son fonctionnement jusqu'à ce que le déclencheur est fait, aussi ..... –

+0

@JoseFelipeBlumdeAraujo, l'approche basée sur l'ensemble que j'ai mentionné serait le mieux. Pour des recommandations spécifiques sur l'amélioration des performances avec le curseur, vous devez ajouter ce que vous avez essayé à votre question avec le DDL pour les tables, les index et le code proc. Les exemples généraux sont trop larges ici. –