Problème de requête SQL dans éviter les duplicates dans INSERT INTO SELECT?

La requête suivante fonctionne parfaitement,

insert into [EGallery].dbo.[CustomerDetails] Select Distinct B.CountyB as 'Mobile' , Cast(BuildingB as Varchar(100)) as 'Email' , A.CardCode , A.CardName as 'First Name' , '' as 'Last Name' , '' as Gender , Cast(A.Address as Varchar(1000)) as 'Address' , Convert(Varchar(10), A.U_BirthDay,105) as 'birthday' , Convert(Varchar(10), A.U_AnnivDay ,105) as 'Anniversary' , Case When A.CardCode Like '%%'+ C.WhsCode +'%%' Then Convert(Varchar(10) , A.DocDate ,105) Else Convert(Varchar(10), (Select X.CreateDate From OCRD X Where X.CardCode = A.CardCode) ,105) End as 'JoinDate' , C.WhsCode as 'JoinStore','Open' as Status ,(Select GETDATE()) as CreatedDateTime,(Select GETDATE()) as ProcessDateTime, '' as StatusMSg From OINV A Inner Join INV12 B On A.DocEntry = B.DocEntry Inner Join INV1 C On A.DocEntry = C.DocEntry Where C.LineNum = '0' --B.CountyB not in(select D.Mobile from [EGallery].dbo.[CustomerDetails] D where D.Mobile=B.CountyB) --not exists (select Mobile from [EGallery].dbo.[CustomerDetails] D where D.Mobile=B.CountyB) 

Mais avant d'insert des loggings dans la [EGallery].dbo.[CustomerDetails] , je dois vérifier si le numéro de téléphone existe déjà dans la table. Si l'logging existe déjà, il n'est pas nécessaire de l'insert à nouveau. Pour cela, j'ai ajouté une condition supplémentaire (que j'ai commentée dans la requête) mais elle signale cette erreur lors de l'exécution de la requête:

 Cannot resolve the collation conflict between "SQL_Latin1_General_CP850_CI_AS" and "Latin1_General_CI_AI" in the equal to operation. 

D'après ici vous devez append COLLATE DATABASE_DEFAULT aux requêtes comme ceci:

 Where C.LineNum = '0' AND B.CountyB not in(select D.Mobile from [EGallery].dbo.[CustomerDetails] D where D.Mobile COLLATE DATABASE_DEFAULT = B.CountyB COLLATE DATABASE_DEFAULT) AND not exists (select Mobile from [EGallery].dbo.[CustomerDetails] D where D.Mobile COLLATE DATABASE_DEFAULT = B.CountyB COLLATE DATABASE_DEFAULT) 

Essayez de le faire avant votre requête:

 USE [db name for object INV12] GO ALTER TABLE [EGallery].dbo.[CustomerDetails] ALTER COLUMN Mobile VARCHAR(100) COLLATE Latin1_General_CI_AS NOT NULL ALTER TABLE INV12 ALTER COLUMN CountyB VARCHAR(100) COLLATE Latin1_General_CI_AS NOT NULL 

UPDATE1: Si vous avez un index sur l'une de ces colonnes ou sur les deux, vous devez le supprimer et créer à nouveau un index après un nouveau classment.

Je vous recommand d'utiliser une instruction MERGE , car elle

effectue des opérations d'insertion, de mise à jour ou de suppression sur une table cible en fonction des résultats d'une jointure avec une table source. Par exemple, vous pouvez synchroniser deux tables en insérant, en mettant à jour ou en supprimant des lignes d'une table en fonction des différences trouvées dans l'autre table.