none
MERGE + CASE per UPDATE RRS feed

  • Domanda

  • Salve,

    chiedo un consiglio circa l'utilizzo del case in un MERGE che deve eseguire update condizionali.

    Il merge aggiorna i campi in seguito al confronto della datamodifica del record sorgente.

    domande:

    E' normale che se non metto la condizione Else il record viene aggiornato a null? io vorrei che nel caso il confronto fallisse non venisse aggiornato il record

    TARGET.[NumeroDocCli]     =  (CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[NumeroDocCli]  END)

    ho modificato il case così per evitare venisse inserito il valore nullo in caso di confronto

    TARGET.[NumeroDocCli]     =  (CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[NumeroDocCli] ELSE TARGET.[DataModifica_DocCli] END)

    Allego per completezza il merge completo per dare l'idea della funzionalità...

    DECLARE @vSQL1 as varchar(max)
    
    /*** Creo la Tabella TEMP di origine ***/
    SET @vSQL1 = '
    SELECT [IdTestaDocCli]      ,[IDRigaDocCli]      ,
    		isnull([IdTesta_ORS],0) IdTesta_ORS     ,isnull([IdRiga_ORS],0)   IdRiga_ORS         ,[EsercizioCLI]      ,[TipoDocCli]
          ,[NumeroDocCli]      ,[BisCli]      ,[DataDocCli]      ,[DOCCHIUSO]      ,[NumRifDocCli]      ,[DataRifDocCli]
          ,[IdTrust]      ,[DscTrust]      ,[STATOORDINI]      ,[NaturaTrust]      ,[TIPORIGA]      ,[PosizioneRigaCli]
          ,[NumDoc_ORS]      ,[DATADOC_ORS]      ,[POSIZIONE_R_ORS]      ,[CodiceArticolo]      ,[CodFornitore]      
    	  ,[RAGSOCDDMForn] ,     [INDIRIZZODDMForn] ,       [CAPDDMForn] ,       [LOCALITADDMForn]
    	  ,[codCliente]
          ,[RifStabilimento]      ,[RAGSOCDDM]      ,[INDIRIZZODDM]      ,[CAPDDM]      ,[LOCALITADDM]      ,[PROVINCIADDM]
          ,[RifCommessaCliente]      ,[DescrizioneCommessaCli]      ,[DataConsegnaCli]      ,[NomeTicket]      ,     isnull([PrezzoUnitNettoEuroCli],0) [PrezzoUnitNettoEuroCli]
    	  ,[RSPP_RESPONSABILE]      ,[Dsc_RSPP]      ,[RefPM]      ,[Dsc_RefPM]      ,[RefSegrCons]      ,[Dsc_RefSegrCons]
          ,[RefSegrForm_T]      ,[Dsc_RefSegrForm]      ,[MEDICORESPONSABILE]      ,[Dsc_MedicoResp]      ,[IdDivisione]
          ,[DscDivisione]      ,[TempoPrevisto]      ,[Descrizione]      ,[DscRigaArticoloAgg]      ,[DataModifica_DocCli]
          ,[DataModifica_DocsFornitore]	   ,[Qta] , CODAGENTE1, DscAgente1,RIGACHIUSA
    
    INTO #tmpTicket
    
    FROM '+@DBASE+'.dbo.Vista_ExportAppGest_VTETicket
    WHERE        (IdTestaDocCli  >=1400000)
     
    MERGE ALD_ExportAppGest_VTETicket  AS TARGET
    USING #tmpTicket AS SOURCE 
    ON (TARGET.[IdTestaDocCli] = SOURCE.[IdTestaDocCli]
    AND TARGET.[IDRigaDocCli] = SOURCE.[IDRigaDocCli]
    AND TARGET.StatoImportazione <>''D''
    ) 
    
    
    WHEN MATCHED AND 
    
    (    
    convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) OR
    convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126) 
    )
    
    THEN UPDATE SET
    
      TARGET.[EsercizioCLI]  = (CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[EsercizioCLI] END)
    
    , TARGET.[TipoDocCli] =  (CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[TipoDocCli] END)
    , TARGET.[NumeroDocCli]     =  (CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[NumeroDocCli] ELSE TARGET.[DataModifica_DocCli] END)
    , TARGET.[BisCli]   =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[BisCli] END
    , TARGET.[DataDocCli]=  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[DataDocCli] END  
    , TARGET.[DOCCHIUSO]=  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[DOCCHIUSO] END
    , TARGET.[NumRifDocCli]=  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[NumRifDocCli]   END
    , TARGET.[DataRifDocCli] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[DataRifDocCli]  END
    , TARGET.[IdTrust]=  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[IdTrust]  END
    , TARGET.[DscTrust]=  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[DscTrust]  END
    , TARGET.[STATOORDINI]=  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[STATOORDINI]  END
    , TARGET.[NaturaTrust]=  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[NaturaTrust]  END
    , TARGET.[TIPORIGA]=  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[TIPORIGA]  END
    , TARGET.[PosizioneRigaCli] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[PosizioneRigaCli]  END
    , TARGET.[CodiceArticolo]=  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[CodiceArticolo]  END
    , TARGET.[codCliente] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[codCliente]  END
    
    , TARGET.[RifStabilimento]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[RifStabilimento]
    else SOURCE.[RifStabilimento]  END
    
    
    , TARGET.[RAGSOCDDM]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[RAGSOCDDM]  END
    , TARGET.[INDIRIZZODDM]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[INDIRIZZODDM]  END
    , TARGET.[CAPDDM]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[CAPDDM]   END
    , TARGET.[LOCALITADDM]   =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[LOCALITADDM]   END
    , TARGET.[PROVINCIADDM] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[PROVINCIADDM]   END
    , TARGET.[RifCommessaCliente]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[RifCommessaCliente]   END
    , TARGET.[DescrizioneCommessaCli] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[DescrizioneCommessaCli]   END
    , TARGET.[DataConsegnaCli]   =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[DataConsegnaCli]   END
    , TARGET.[NomeTicket]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[NomeTicket]   END
    , TARGET.[PrezzoUnitNettoEuroCli] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[PrezzoUnitNettoEuroCli]   END
    , TARGET.[RSPP_RESPONSABILE]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[RSPP_RESPONSABILE]   END
    , TARGET.[Dsc_RSPP]    =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[Dsc_RSPP]   END
    , TARGET.[RefPM]    =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[RefPM]   END
    , TARGET.[Dsc_RefPM]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[Dsc_RefPM]   END
    , TARGET.[RefSegrCons]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[RefSegrCons]   END
    , TARGET.[Dsc_RefSegrCons] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[Dsc_RefSegrCons]   END
    , TARGET.[RefSegrForm_T]       =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[RefSegrForm_T]   END
    , TARGET.[Dsc_RefSegrForm]       =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[Dsc_RefSegrForm]   END
    , TARGET.[MEDICORESPONSABILE]     =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[MEDICORESPONSABILE]   END
    , TARGET.[Dsc_MedicoResp]    =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[Dsc_MedicoResp]   END
    , TARGET.[IdDivisione] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[IdDivisione]   END
    , TARGET.[DscDivisione]    =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[DscDivisione]   END
    , TARGET.[TempoPrevisto]   =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[TempoPrevisto]   END
    , TARGET.[Descrizione]   =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[Descrizione]   END
    , TARGET.[DscRigaArticoloAgg]    =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[DscRigaArticoloAgg]   END
    , TARGET.[DataModifica_DocCli] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[DataModifica_DocCli]   END
    , TARGET.[DataModifica_DocsFornitore] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  THEN SOURCE.[DataModifica_DocsFornitore]   END
    , TARGET.[Qta]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.[Qta]   END
    , TARGET.CODAGENTE1 = CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.CODAGENTE1  END
    , TARGET.DscAgente1 = CASE WHEN convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN SOURCE.DscAgente1  END
    
    , TARGET.RIGACHIUSA = SOURCE.RIGACHIUSA
    
    
    , TARGET.[IdTesta_ORS] = CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  THEN SOURCE.IdTesta_ORS   END
    , TARGET.[IdRiga_ORS] = CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  THEN SOURCE.IdRiga_ORS  END
    
    , TARGET.[NumDoc_ORS] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  THEN SOURCE.[NumDoc_ORS]   END
    , TARGET.[DATADOC_ORS] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  THEN SOURCE.[DATADOC_ORS]   END
    , TARGET.[POSIZIONE_R_ORS] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  THEN SOURCE.[POSIZIONE_R_ORS]   END
    
    
    , TARGET.[CodFornitore]       =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  THEN SOURCE.[CodFornitore]  END
    , TARGET.[RAGSOCDDMForn]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  THEN  SOURCE.[RAGSOCDDMForn]   END
    , TARGET.[INDIRIZZODDMForn]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  THEN  SOURCE.[INDIRIZZODDMForn]   END
    , TARGET.[CAPDDMForn]  =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  THEN  SOURCE.[CAPDDMForn]   END
    , TARGET.[LOCALITADDMForn] =  CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  THEN  SOURCE.[LOCALITADDMForn]   END
    
    , TARGET.[DataImportazione] = getdate()
    , TARGET.StatoImportazione =''I''
    , TARGET.SelUpdate = CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  
    			THEN  ''F''   WHEN  convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) THEN  ''C'' END
    
    
    WHEN NOT MATCHED BY TARGET 
    
    THEN INSERT 
    	  ([IdTestaDocCli]      ,[IDRigaDocCli]      ,
    	    IdTesta_ORS     ,   IdRiga_ORS         ,[EsercizioCLI]      ,[TipoDocCli]
          ,[NumeroDocCli]      ,[BisCli]      ,[DataDocCli]      ,[DOCCHIUSO]      ,[NumRifDocCli]      ,[DataRifDocCli]
          ,[IdTrust]      ,[DscTrust]      ,[STATOORDINI]      ,[NaturaTrust]      ,[TIPORIGA]      ,[PosizioneRigaCli]
          ,[NumDoc_ORS]      ,[DATADOC_ORS]      ,[POSIZIONE_R_ORS]      ,[CodiceArticolo]      ,[CodFornitore]      
    	  ,[RAGSOCDDMForn] ,     [INDIRIZZODDMForn] ,       [CAPDDMForn] ,       [LOCALITADDMForn]
    	  ,[codCliente]
          ,[RifStabilimento]      ,[RAGSOCDDM]      ,[INDIRIZZODDM]      ,[CAPDDM]      ,[LOCALITADDM]      ,[PROVINCIADDM]
          ,[RifCommessaCliente]      ,[DescrizioneCommessaCli]      ,[DataConsegnaCli]      ,[NomeTicket]      ,[PrezzoUnitNettoEuroCli]
    	  ,[RSPP_RESPONSABILE]      ,[Dsc_RSPP]      ,[RefPM]      ,[Dsc_RefPM]      ,[RefSegrCons]      ,[Dsc_RefSegrCons]
          ,[RefSegrForm_T]      ,[Dsc_RefSegrForm]      ,[MEDICORESPONSABILE]      ,[Dsc_MedicoResp]      ,[IdDivisione]
          ,[DscDivisione]      ,[TempoPrevisto]      ,[Descrizione]      ,[DscRigaArticoloAgg]      ,[DataModifica_DocCli]
          ,[DataModifica_DocsFornitore]	   ,[Qta], CODAGENTE1, DscAgente1 ,  DataImportazione, StatoImportazione,RIGACHIUSA ) 
    
    VALUES (
    
    		SOURCE.[IdTestaDocCli],SOURCE.[IDRigaDocCli]      
    		,SOURCE.IdTesta_ORS,   SOURCE.IdRiga_ORS, SOURCE.[EsercizioCLI], SOURCE.[TipoDocCli]
    		, SOURCE.[NumeroDocCli], SOURCE.[BisCli], SOURCE.[DataDocCli], SOURCE.[DOCCHIUSO], SOURCE.[NumRifDocCli], SOURCE.[DataRifDocCli]
    		, SOURCE.[IdTrust], SOURCE.[DscTrust], SOURCE.[STATOORDINI], SOURCE.[NaturaTrust], SOURCE.[TIPORIGA], SOURCE.[PosizioneRigaCli]
    		, SOURCE.[NumDoc_ORS], SOURCE.[DATADOC_ORS], SOURCE.[POSIZIONE_R_ORS], SOURCE.[CodiceArticolo], SOURCE.[CodFornitore]      
    		, SOURCE.[RAGSOCDDMForn] , SOURCE.[INDIRIZZODDMForn] , SOURCE.[CAPDDMForn] , SOURCE.[LOCALITADDMForn]
    		, SOURCE.[codCliente]
    		, SOURCE.[RifStabilimento], SOURCE.[RAGSOCDDM], SOURCE.[INDIRIZZODDM]      , SOURCE.[CAPDDM], SOURCE.[LOCALITADDM], SOURCE.[PROVINCIADDM]
    		, SOURCE.[RifCommessaCliente], SOURCE.[DescrizioneCommessaCli], SOURCE.[DataConsegnaCli], SOURCE.[NomeTicket], SOURCE.[PrezzoUnitNettoEuroCli]
    		, SOURCE.[RSPP_RESPONSABILE], SOURCE.[Dsc_RSPP], SOURCE.[RefPM], SOURCE.[Dsc_RefPM], SOURCE.[RefSegrCons], SOURCE.[Dsc_RefSegrCons]
    		, SOURCE.[RefSegrForm_T], SOURCE.[Dsc_RefSegrForm], SOURCE.[MEDICORESPONSABILE], SOURCE.[Dsc_MedicoResp], SOURCE.[IdDivisione]
    		, SOURCE.[DscDivisione], SOURCE.[TempoPrevisto], SOURCE.[Descrizione], SOURCE.[DscRigaArticoloAgg], SOURCE.[DataModifica_DocCli]
    		, SOURCE.[DataModifica_DocsFornitore], SOURCE.[Qta], SOURCE.[CODAGENTE1],  SOURCE.[DscAgente1], getdate(),''I'', SOURCE.RIGACHIUSA
    		
    		)
    
    
    WHEN NOT MATCHED BY SOURCE AND TARGET.StatoImportazione <>''D'' THEN
    
    UPDATE SET 
    
    
      TARGET.[DataImportazione] = getdate()
    , TARGET.[StatoImportazione] =''D'';
    
    
    
    
    DROP TABLE #tmpTicket
    
    '
    EXEC (@vSQL1)
    
    SELECT @@ROWCOUNT;
    
    
    
    END
    
    
    




    Marco

    lunedì 3 agosto 2020 09:56

Risposte

Tutte le risposte

  • Ciao io controllerei se già sono presenti valori null prima di fare il merge
    lunedì 3 agosto 2020 10:24
  • Sul Source non vi sono valori nulli.

    La vista che seleziona i dati per il MERGE, filtra i dati in modo corretto.

    La mia domanda è volta a capire meglio come agisce il singolo CASE sulla funzione di MERGE:

    Ogni CASE esegue comunque un UPDATE sul record inserendo dati nulli perchè la funzione di confronto restituisce null in quanto non presente l'istruzione ELSE (Primo Screen di codice inserito).

    Così inserendo l'Else inserisce il valore già presente sul target.

    La mia curiosità è sapere se è possibile, in caso il confronto del singolo CASE non corrispondesse ai criteri, saltare e passare al CASE successivo senza apportare alcun update nel record corrente per quel campo.

    Spero di essere riuscito a spiegare la situazione


    Marco

    lunedì 3 agosto 2020 12:42
  • Ciao,

    si il comportamento che segnali è normale e ben documentato nella guida: TSQL case.

    Se desideri puoi ricorrere all' IIF(), del tutto equivalente al CASE, che utilizza una notazione leggermente più compatta.

    G.

    lunedì 3 agosto 2020 12:49
  • Come già detto da gnic il comportamento è corretto. 

    Nel tuo caso specifico dato che la condizione è  quasi sempre la medesima alla WHEN MATCHED AND così:

    ECLARE @vSQL1 as varchar(max)
    
    /*** Creo la Tabella TEMP di origine ***/
    SET @vSQL1 = '
    SELECT [IdTestaDocCli]      ,[IDRigaDocCli]      ,
    		isnull([IdTesta_ORS],0) IdTesta_ORS     ,isnull([IdRiga_ORS],0)   IdRiga_ORS         ,[EsercizioCLI]      ,[TipoDocCli]
          ,[NumeroDocCli]      ,[BisCli]      ,[DataDocCli]      ,[DOCCHIUSO]      ,[NumRifDocCli]      ,[DataRifDocCli]
          ,[IdTrust]      ,[DscTrust]      ,[STATOORDINI]      ,[NaturaTrust]      ,[TIPORIGA]      ,[PosizioneRigaCli]
          ,[NumDoc_ORS]      ,[DATADOC_ORS]      ,[POSIZIONE_R_ORS]      ,[CodiceArticolo]      ,[CodFornitore]      
    	  ,[RAGSOCDDMForn] ,     [INDIRIZZODDMForn] ,       [CAPDDMForn] ,       [LOCALITADDMForn]
    	  ,[codCliente]
          ,[RifStabilimento]      ,[RAGSOCDDM]      ,[INDIRIZZODDM]      ,[CAPDDM]      ,[LOCALITADDM]      ,[PROVINCIADDM]
          ,[RifCommessaCliente]      ,[DescrizioneCommessaCli]      ,[DataConsegnaCli]      ,[NomeTicket]      ,     isnull([PrezzoUnitNettoEuroCli],0) [PrezzoUnitNettoEuroCli]
    	  ,[RSPP_RESPONSABILE]      ,[Dsc_RSPP]      ,[RefPM]      ,[Dsc_RefPM]      ,[RefSegrCons]      ,[Dsc_RefSegrCons]
          ,[RefSegrForm_T]      ,[Dsc_RefSegrForm]      ,[MEDICORESPONSABILE]      ,[Dsc_MedicoResp]      ,[IdDivisione]
          ,[DscDivisione]      ,[TempoPrevisto]      ,[Descrizione]      ,[DscRigaArticoloAgg]      ,[DataModifica_DocCli]
          ,[DataModifica_DocsFornitore]	   ,[Qta] , CODAGENTE1, DscAgente1,RIGACHIUSA
    
    INTO #tmpTicket
    
    FROM '+@DBASE+'.dbo.Vista_ExportAppGest_VTETicket
    WHERE        (IdTestaDocCli  >=1400000)
     
    MERGE ALD_ExportAppGest_VTETicket  AS TARGET
    USING #tmpTicket AS SOURCE 
    ON (TARGET.[IdTestaDocCli] = SOURCE.[IdTestaDocCli]
    AND TARGET.[IDRigaDocCli] = SOURCE.[IDRigaDocCli]
    AND TARGET.StatoImportazione <>''D''
    ) 
    
    
    WHEN MATCHED AND 
    
    (    
    convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) OR
    convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126) 
    ) AND (convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126))
    
    THEN UPDATE SET
    
      TARGET.[EsercizioCLI]  = SOURCE.[EsercizioCLI]
    , TARGET.[TipoDocCli]   =  SOURCE.[TipoDocCli]
    , TARGET.[NumeroDocCli] =  SOURCE.[NumeroDocCli] 
    , TARGET.[BisCli]   =  SOURCE.[BisCli]
    , TARGET.[DataDocCli]= SOURCE.[DataDocCli]
    , TARGET.[DOCCHIUSO] =  SOURCE.[DOCCHIUSO]
    , TARGET.[NumRifDocCli] =  SOURCE.[NumRifDocCli]
    , TARGET.[DataRifDocCli] =  SOURCE.[DataRifDocCli]
    , TARGET.[IdTrust] = SOURCE.[IdTrust]
    , TARGET.[DscTrust] =  SOURCE.[DscTrust]
    , TARGET.[STATOORDINI]=  SOURCE.[STATOORDINI]  
    , TARGET.[NaturaTrust]=  SOURCE.[NaturaTrust] 
    , TARGET.[TIPORIGA] =   SOURCE.[TIPORIGA]
    , TARGET.[PosizioneRigaCli] =  SOURCE.[PosizioneRigaCli]
    , TARGET.[CodiceArticolo]=  SOURCE.[CodiceArticolo]
    , TARGET.[codCliente] =  SOURCE.[codCliente] 
    , TARGET.[RifStabilimento]  =   SOURCE.[RifStabilimento] 
    , TARGET.[RAGSOCDDM]  =   SOURCE.[RAGSOCDDM]
    , TARGET.[INDIRIZZODDM]  =  SOURCE.[INDIRIZZODDM]
    , TARGET.[CAPDDM]  =  SOURCE.[CAPDDM] 
    , TARGET.[LOCALITADDM]   =  SOURCE.[LOCALITADDM]
    , TARGET.[PROVINCIADDM] =  SOURCE.[PROVINCIADDM] 
    , TARGET.[RifCommessaCliente]  =  SOURCE.[RifCommessaCliente]
    , TARGET.[DescrizioneCommessaCli] =  SOURCE.[DescrizioneCommessaCli]
    , TARGET.[DataConsegnaCli]   =  SOURCE.[DataConsegnaCli] 
    , TARGET.[NomeTicket]  =   SOURCE.[NomeTicket] 
    , TARGET.[PrezzoUnitNettoEuroCli] =  SOURCE.[PrezzoUnitNettoEuroCli]
    , TARGET.[RSPP_RESPONSABILE]  =  SOURCE.[RSPP_RESPONSABILE]
    , TARGET.[Dsc_RSPP]    =  SOURCE.[Dsc_RSPP]   
    , TARGET.[RefPM]    =  SOURCE.[RefPM]  
    , TARGET.[Dsc_RefPM]  =   SOURCE.[Dsc_RefPM] 
    , TARGET.[RefSegrCons]  =  SOURCE.[RefSegrCons]
    , TARGET.[Dsc_RefSegrCons] =  SOURCE.[Dsc_RefSegrCons]
    , TARGET.[RefSegrForm_T]   =  SOURCE.[RefSegrForm_T]
    , TARGET.[Dsc_RefSegrForm] =  SOURCE.[Dsc_RefSegrForm]  
    , TARGET.[MEDICORESPONSABILE] =  SOURCE.[MEDICORESPONSABILE]
    , TARGET.[Dsc_MedicoResp] =  SOURCE.[Dsc_MedicoResp]  
    , TARGET.[IdDivisione] =  SOURCE.[IdDivisione] 
    , TARGET.[DscDivisione]  = SOURCE.[DscDivisione]
    , TARGET.[TempoPrevisto] =  SOURCE.[TempoPrevisto]
    , TARGET.[Descrizione]   =  SOURCE.[Descrizione]
    , TARGET.[DscRigaArticoloAgg]  = SOURCE.[DscRigaArticoloAgg]
    , TARGET.[DataModifica_DocCli] =  SOURCE.[DataModifica_DocCli]
    , TARGET.[DataModifica_DocsFornitore] =  SOURCE.[DataModifica_DocsFornitore]  
    , TARGET.[Qta]  =  THEN SOURCE.[Qta]   END
    , TARGET.CODAGENTE1 = SOURCE.CODAGENTE1
    , TARGET.DscAgente1 = THEN SOURCE.DscAgente1
    
    , TARGET.RIGACHIUSA = SOURCE.RIGACHIUSA
    , TARGET.[IdTesta_ORS] =  SOURCE.IdTesta_ORS 
    , TARGET.[IdRiga_ORS] =  SOURCE.IdRiga_ORS  
    , TARGET.[NumDoc_ORS] =  SOURCE.[NumDoc_ORS] 
    , TARGET.[DATADOC_ORS] =  SOURCE.[DATADOC_ORS]  
    , TARGET.[POSIZIONE_R_ORS] =  SOURCE.[POSIZIONE_R_ORS] 
    
    
    , TARGET.[CodFornitore]       =  SOURCE.[CodFornitore]
    , TARGET.[RAGSOCDDMForn]  =   SOURCE.[RAGSOCDDMForn]  
    , TARGET.[INDIRIZZODDMForn]  =  SOURCE.[INDIRIZZODDMForn] 
    , TARGET.[CAPDDMForn]  =  SOURCE.[CAPDDMForn]
    , TARGET.[LOCALITADDMForn] =  SOURCE.[LOCALITADDMForn]
    
    , TARGET.[DataImportazione] = getdate()
    , TARGET.StatoImportazione =''I''
    , TARGET.SelUpdate = CASE WHEN convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126)  
    			THEN  ''F''   ELSE  ''C'' END
    
    WHEN MATCHED AND 
    
    (    
    convert(datetime, TARGET.[DataModifica_DocCli], 126) <> convert(datetime, SOURCE.[DataModifica_DocCli], 126) OR
    convert(datetime, TARGET.[DataModifica_DocsFornitore], 126) <> convert(datetime, SOURCE.[DataModifica_DocsFornitore], 126) 
    ) AND (convert(datetime, TARGET.[DataModifica_DocCli], 126) = convert(datetime, SOURCE.[DataModifica_DocCli], 126))
    
    THEN UPDATE SET
     TARGET.[NumeroDocCli] =  TARGET.[DataModifica_DocCli]
     ,TARGET.[RifStabilimento] = 
    WHEN NOT MATCHED BY TARGET 
    
    THEN INSERT 
    	  ([IdTestaDocCli]      ,[IDRigaDocCli]      ,
    	    IdTesta_ORS     ,   IdRiga_ORS         ,[EsercizioCLI]      ,[TipoDocCli]
          ,[NumeroDocCli]      ,[BisCli]      ,[DataDocCli]      ,[DOCCHIUSO]      ,[NumRifDocCli]      ,[DataRifDocCli]
          ,[IdTrust]      ,[DscTrust]      ,[STATOORDINI]      ,[NaturaTrust]      ,[TIPORIGA]      ,[PosizioneRigaCli]
          ,[NumDoc_ORS]      ,[DATADOC_ORS]      ,[POSIZIONE_R_ORS]      ,[CodiceArticolo]      ,[CodFornitore]      
    	  ,[RAGSOCDDMForn] ,     [INDIRIZZODDMForn] ,       [CAPDDMForn] ,       [LOCALITADDMForn]
    	  ,[codCliente]
          ,[RifStabilimento]      ,[RAGSOCDDM]      ,[INDIRIZZODDM]      ,[CAPDDM]      ,[LOCALITADDM]      ,[PROVINCIADDM]
          ,[RifCommessaCliente]      ,[DescrizioneCommessaCli]      ,[DataConsegnaCli]      ,[NomeTicket]      ,[PrezzoUnitNettoEuroCli]
    	  ,[RSPP_RESPONSABILE]      ,[Dsc_RSPP]      ,[RefPM]      ,[Dsc_RefPM]      ,[RefSegrCons]      ,[Dsc_RefSegrCons]
          ,[RefSegrForm_T]      ,[Dsc_RefSegrForm]      ,[MEDICORESPONSABILE]      ,[Dsc_MedicoResp]      ,[IdDivisione]
          ,[DscDivisione]      ,[TempoPrevisto]      ,[Descrizione]      ,[DscRigaArticoloAgg]      ,[DataModifica_DocCli]
          ,[DataModifica_DocsFornitore]	   ,[Qta], CODAGENTE1, DscAgente1 ,  DataImportazione, StatoImportazione,RIGACHIUSA ) 
    
    VALUES (
    
    		SOURCE.[IdTestaDocCli],SOURCE.[IDRigaDocCli]      
    		,SOURCE.IdTesta_ORS,   SOURCE.IdRiga_ORS, SOURCE.[EsercizioCLI], SOURCE.[TipoDocCli]
    		, SOURCE.[NumeroDocCli], SOURCE.[BisCli], SOURCE.[DataDocCli], SOURCE.[DOCCHIUSO], SOURCE.[NumRifDocCli], SOURCE.[DataRifDocCli]
    		, SOURCE.[IdTrust], SOURCE.[DscTrust], SOURCE.[STATOORDINI], SOURCE.[NaturaTrust], SOURCE.[TIPORIGA], SOURCE.[PosizioneRigaCli]
    		, SOURCE.[NumDoc_ORS], SOURCE.[DATADOC_ORS], SOURCE.[POSIZIONE_R_ORS], SOURCE.[CodiceArticolo], SOURCE.[CodFornitore]      
    		, SOURCE.[RAGSOCDDMForn] , SOURCE.[INDIRIZZODDMForn] , SOURCE.[CAPDDMForn] , SOURCE.[LOCALITADDMForn]
    		, SOURCE.[codCliente]
    		, SOURCE.[RifStabilimento], SOURCE.[RAGSOCDDM], SOURCE.[INDIRIZZODDM]      , SOURCE.[CAPDDM], SOURCE.[LOCALITADDM], SOURCE.[PROVINCIADDM]
    		, SOURCE.[RifCommessaCliente], SOURCE.[DescrizioneCommessaCli], SOURCE.[DataConsegnaCli], SOURCE.[NomeTicket], SOURCE.[PrezzoUnitNettoEuroCli]
    		, SOURCE.[RSPP_RESPONSABILE], SOURCE.[Dsc_RSPP], SOURCE.[RefPM], SOURCE.[Dsc_RefPM], SOURCE.[RefSegrCons], SOURCE.[Dsc_RefSegrCons]
    		, SOURCE.[RefSegrForm_T], SOURCE.[Dsc_RefSegrForm], SOURCE.[MEDICORESPONSABILE], SOURCE.[Dsc_MedicoResp], SOURCE.[IdDivisione]
    		, SOURCE.[DscDivisione], SOURCE.[TempoPrevisto], SOURCE.[Descrizione], SOURCE.[DscRigaArticoloAgg], SOURCE.[DataModifica_DocCli]
    		, SOURCE.[DataModifica_DocsFornitore], SOURCE.[Qta], SOURCE.[CODAGENTE1],  SOURCE.[DscAgente1], getdate(),''I'', SOURCE.RIGACHIUSA
    		
    		)
    
    
    WHEN NOT MATCHED BY SOURCE AND TARGET.StatoImportazione <>''D'' THEN
    
    UPDATE SET 
    
    
      TARGET.[DataImportazione] = getdate()
    , TARGET.[StatoImportazione] =''D'';
    
    
    
    
    DROP TABLE #tmpTicket
    
    '
    EXEC (@vSQL1)
    
    SELECT @@ROWCOUNT;
    
    
    
    END

    nel comando merge puoi ripete più volte WHEN MATCHED AND, l'importante che non si ripeta più volte la medesima condizione dopo lo AND.

    Un suggerimento per la prossime volte, quando posti una domanda crea un piccolo script in cui crei tabelle e dati di esempio che evidenzia il problema che vuoi risolvere, in modo tale che sia più veloce risponderti. Il non plus ultra sarebbe creare l'esempio su Sql Fiddle o similari.

    lunedì 3 agosto 2020 13:27