Je travaille actuellement sur un package SSIS qui extrait une table d'une base de données à une autre. Les tables des deux bases de données utilisent la même colonne que la clé primaire. Mon instruction select pour extraire les données est une simple instruction select. Lorsque j'ai couru le paquet je recevais une erreur qu'il y avait des valeurs de clé primaire en double. J'ai revu mon instruction select et vérifié que mon instruction select ne retournait pas les lignes dupliquées. Donc, pour tester cela, j'ai retiré la clé primaire de la table que j'insère les données dans et réexécuter le paquet SSIS. Après avoir couru j'ai regardé la table pour voir quelles lignes étaient dupliquées. Ce que j'ai trouvé, c'est que les lignes qui étaient éditées pendant que l'extrait était en cours de duplication, il y avait un enregistrement avant l'édition, et un enregistrement après l'édition. Je pourrais facilement le dire parce que la table a un dernier champ modifié qui est mis à jour chaque fois qu'un enregistrement est mis à jour.Requête SQL Server renvoyant plusieurs lignes
J'ai ajouté un indicateur NOLOCK à mon instruction select, et il a cessé de renvoyer des lignes en double.
Alors ma question est pourquoi? Je m'attendais à ce qu'une instruction select avec un indicateur de table NOLOCK ait plus de chances de renvoyer des lignes dupliquées car elle n'utilise pas de verrouillage et qu'une instruction select sans l'indicateur NOLOCK doit utiliser le verrouillage pour s'assurer qu'il ne renvoie pas de doublon lignes
Voici l'instruction select que j'utilise pour sélectionner les données. Je vérifiaient que les jointures ne sont pas à l'origine pour les lignes en double:
SELECT pe.enc_id,
pe.enc_nbr,
pe.billable_ind,
pe.clinical_ind AS clinical_ind,
pe.budget_ind,
pe.print_stmt_ind,
pe.send_coll_letter_ind,
pe.outsource_exempt_ind,
cb.First_name + ' ' + cb.last_name AS CreatedBy,
pe.create_timestamp AS create_timestamp,
mb.first_name + ' ' + mb.last_name AS ModifiedBy,
pe.modify_timestamp AS modify_timestamp
FROM patient_encounter pe WITH(NOLOCK)
LEFT OUTER JOIN user_mstr cb WITH(NOLOCK) ON
pe.created_by = cb.user_id
LEFT OUTER JOIN user_mstr mb WITH(NOLOCK) ON
pe.modified_by = mb.user_id
Merci pour l'information. J'ai ajouté l'instruction select que j'utilise à la poste. Pourquoi prend-il deux fois la ligne? Après l'avoir lu la première fois, pourquoi une modification de l'enregistrement le ferait-il relire? –
Gardez à l'esprit que les "astuces" peuvent être remplacées par le serveur, même si vous n'utilisez pas NOLOCK, il peut utiliser cela en interne, donc les lignes en double. –
Bon point, merci. Y at-il de toute façon à dire ce qui est utilisé en interne? –