2010-12-04 3 views
0
INSERT INTO table 2 
SELECT values FROM table 1 LEFT JOIN table 2 
ON 1.col1 = 2.col1 and 
    1.col2 = 2.col2 and 
    1.col3 = 2.col3 
WHERE 
( 
    2.col1 IS NULL AND 
    2.col2 IS NULL AND 
    2.col3 IS NULL 
) 

col1, col2, clés primaires col3 pour le tableau 2violation de la clé primaire ???? même quand il y a un chk ne pas insérer l'enregistrement

a également fait un jointure interne sur la clé primaire de l'état <> a ajouté un si existe pas (sélectionnez 1 de la table 2 se joindre à la table 1 sur les clés primaires =) toujours obtenir violation d'erreur clé primaire ne peut pas insérer

s'il vous plaît aider

+1

Vous venez couru le SELECT par lui-même pour vérifier la sortie? Vous pourriez voir d'où vient la dupe. –

+0

OUI EN FAIT JE RETIRE DUPLUS DU TABLE 1 AVANT INSERER – Vijay

+0

il y a un autre proc en cours d'exécution b4 mon proc qui insère ou met à jour dans la même table qui est yi chk si l'enregistrement est déjà là – Vijay

Répondre

0

Sans essayer de comprendre pourquoi vous obtenez le problème que vous voyez, je vous suggère vous réécrivez votre SQL à utiliser la commande MERGE. Voir here.

Il vous permet de spécifier ce qu'il faut faire s'il y a un enregistrement en double ou non.

Comme une note, si vous souhaitez assurer une procédure stockée fonctionne exclusivement (vous avez fait allusion à ce sujet), vous avez besoin:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE   -- most restrictive 

     BEGIN TRY 
      BEGIN TRAN 

      DECLARE @LockResult int 

      SET @LockName = 'MyLockName' 

      EXEC @LockResult = sp_getapplock @Resource = @LockName, @LockMode = 'Exclusive', @LockTimeout = 0 

      if @LockResult <> 0 begin 
       SET @Failed = 1 
      end else begin 
       -- WORK HERE 
      end 

      -- FINALIZE TRANSACTION 
     END TRY 
     BEGIN CATCH 
      -- CATCH CODE 
     END CATCH 

     SET TRANSACTION ISOLATION LEVEL READ COMMITTED -- set back to default 
Questions connexes