2011-01-21 2 views
2

L'événement de table a un à la place du déclencheur, dont le but est de générer la clé primaire EventId en tant que Max + 1, le reste des colonnes est rempli à partir d'inséré.SQL Au lieu de déclencher ne déclenche pas parfois?

EventId est pas l'identité, et nous ne pouvons le faire identité il y a beaucoup de depedency là, la logique de déclenchement:

SELECT TOP 1 @ID = Event.EventID FROM Event 
IF (@ID IS NULL) 
BEGIN 
    SET @ID=1 
END 
ELSE 
BEGIN 
    SELECT @ID = MAX(Event.EventID) FROM Event 
    SET @[email protected]+1 
END 
--Then just a insert statment with this id as EventId and rest of the columns from inserted table 

Maintenant, parfois, quand je tente d'insérer dans cette table, il dit encore peut 't insert duplicate in eventId, Je ne sais pas pourquoi cela se produit ...

On dirait que la gâchette ne s'allume pas dans certains cas? Pourquoi

Répondre

2

Vous supposez probablement qu'il existe une seule ligne dans la table pseudo insérée et qu'elle échoue lors de l'insertion d'une ligne multiple.

Vous voulez quelque chose comme:

;with maxID as (
    select MAX(EventID) as EventID from Event 
), nrows as (
    select 
     ROW_NUMBER() OVER (ORDER BY newid()) + 
      COALESCE((select EventID from maxID),0) as EventID, 
     /* columns from inserted table */ 
    from inserted 
) 
insert into Event (EventID,/* other columns */) 
select EventID,/* other columns */ 
from nrows 
+0

Donc, cela va ajouter un certain type de verrouillage là-bas, laissez-moi essayer cela ... – Lalit

+0

Cela a fonctionné comme dieu, mais pourriez-vous s'il vous plaît expliquer quel était le problème avec la logique précédente. Est-ce à cause du verrou de table? – Lalit

+0

@Lalit - pour être honnête, je résolvais (peut-être) le mauvais problème - je pensais que vous pourriez insérer plusieurs lignes dans la table dans une seule instruction 'INSERT'. Mais je crois que la réponse ci-dessus, car il s'agit de l'ensemble de la "recherche de MAX, élaborer de nouvelles valeurs d'identification basées sur elle, insérer de nouvelles valeurs" comme une déclaration unique - donc vous n'avez pas besoin de déblatérer avec verrouillage conseils ou changer les niveaux d'isolement. –

1

Vous devez utiliser un certain type de verrouillage pour empêcher la génération de doublons. Jetez un oeil à this thread d'un problème similaire pour des idées sur la façon d'aborder cela.

+0

Oui, je suis ce en utilisant le tableau Insertion Type de 2008, afin d'insérer tas de dossiers à la fois. – Lalit

Questions connexes