2010-10-19 7 views
2

Je ne suis pas si expérimenté sur les bases de données, si nue avec moi. ;-) Un déclencheur FOR INSERT assez simple renvoie l'erreur "La sous-requête a renvoyé plus de 1 valeur .." lors de l'insertion de plusieurs lignes à la fois. Quand j'insère des lignes dans la table SOA.dbo.photos_TEST en utilisant une instruction comme;La sous-requête a renvoyé plus de 1 valeur. sur MS SQL 2005 déclencheur

INSERT INTO SOA.dbo.photos_TEST (id,length,picture,type,name,value,arrivaldatetime) 
SELECT VW.id, ... , 
FROM SOA.dbo.AeosPhotoTEST_VW vw 
WHERE ... 

L'insertion échoue. Mais quand j'ajoute un TOP (1) à l'instruction SELECT, le déclencheur ne signale pas d'erreur. Il est donc probable que l'instruction "SELECT VALUE FROM INSERTED" dans le déclencheur renvoie toutes les lignes de la table INSERTED. Dois-je itérer dans la gâchette througg toutes les lignes dans INSERTED? Toute suggestion est la bienvenue.

Le code actuel du déclencheur est;

SELECT @VALUE = (SELECT VALUE FROM INSERTED) 

SET NOCOUNT ON 

BEGIN 
    DELETE FROM SOA.dbo.photos_TEST 
    WHERE (value = @VALUE) 
    AND (arrivaldatetime < (SELECT arrivaldatetime 
       FROM INSERTED 
       WHERE value = @VALUE)) 
END 

Répondre

3

Modifier la logique de suppression de déclenchement T-SQL sur les points suivants:

DELETE A 
FROM SOA.dbo.photos_TEST A 
    INNER JOIN INSERTED B on 
     A.VALUE = B.VALUE 
WHERE A.arrivaldatetime < B.arrivaldatetime 
+0

Salut John, en changeant le déclencheur comme vous le suggérez retourne toujours « sous-requête retourné plus de 1 valeur. Ce n'est pas autorisée lorsque le ... » lors de l'ajout de plus de 1 rang. – pcvnes

+0

+1 pour m'avoir appris un nouveau truc. Très apprécié, merci. –

+0

@pcvnes, il ne devrait pas. Êtes-vous certain d'avoir changé le déclencheur? Pouvez-vous poster le script mis à jour? –

1

Je suppose que vous devez supprimer toutes les anciennes valeurs. Ajuster votre déclencheur comme ci-dessous fait l'affaire.

Trigger

BEGIN 
    DELETE p 
    FROM SOA.dbo.photos_TEST p 
      INNER JOIN INSERTED i ON i.Value = p.Value 
            AND i.ArrivalDateTime > p.ArrivalDateTime 
    END 
+0

De rien mon ami. Je sais ce que tu veux dire aussi. Le jour où j'arrête d'apprendre est le jour où je cherche une nouvelle carrière! –

+0

@John, merci pour l'édition. Je suis toujours excité d'apprendre de nouvelles façons de faire les choses plus rapidement. :) –

+0

Bonjour Lieven, Merci! Celui-ci fonctionne aussi! Est-ce bien le cas lorsque vous insérez plusieurs lignes dans une table, la table INSERTED contient plusieurs lignes et le trigger n'est exécuté qu'une seule fois? J'ai supposé que chaque mise à jour de ligne entraînait un événement déclencheur distinct. – pcvnes