Scusate... non avevo visto l'anteprima.... il codice è questo... non riesco ancora a capire come poter ripetere lo stesso while passando i valori ...
domanda... i record sono circa 40.000...
scusate l'ipotesi magari strampalata...: potrei utilizzare 2 array depositando ad ogni ciclo il valore degli id e poi utilizzare gli array per passare i valori a 2 statement per vedere il vecchio valore ed il nuovo?.....
Scusate ma sono agli inizi e vedo ancora molto buio...

codice:
<?php

date_default_timezone_set('Europe/Rome');

// Imposto i parametri di connessione
$serverName = "localhost";
$connectionInfo = array(
     "Database"=>"Sicura", 
     "UID"=>"Profiler", 
     "PWD"=>"65tekra20"
    );

//Effettuo la connessione al database
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
     die( print_r( sqlsrv_errors(), true));
}

// esecuzione della query che imposta i parametri di riferimento per tutti i contratti da aggiornare definizione del primo ciclo
$sql = "SELECT [IDCONTRATTO] ,[CodiceSezUpdated],[OreSezUpdated] FROM [Sicura].[dbo].[BiriOreSezUpdated]";
$params = array();
$options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$stmt = sqlsrv_query( $conn, $sql , $params, $options );
$row_count = sqlsrv_num_rows( $stmt );
// Se l'oggetto è vuoto restituisco un errore
if( $stmt === false ) {
     die( print_r( sqlsrv_errors(), true));
}

//Inizio del primo ciclo, per ogni record origine ricerco i vecchi contratti
while($obj = sqlsrv_fetch_object($stmt)) {
//Setto i valori di contratto, sezione ed ore origine
$contrattoorigine=$obj->IDCONTRATTO;
$sezioneorigine=$obj->CodiceSezUpdated;
$oreupdatedorigine=$obj->OreSezUpdated;

//Inposto la prima ricerca per il primo rinnovo
$sql1 = "SELECT [IDCONTRATTO] ,[SEZIONECONTRATTO] ,[OLD_RifSezioneGemma] ,[ORE_INT], [SEZIONECONTRATTO_Prec] 
FROM    [Sicura].[dbo].[GEM_SEZIONICONTRATTO] 
WHERE [IDCONTRATTO]='".$contrattoorigine."' and [SEZIONECONTRATTO]='".$sezioneorigine."'";
$stmt1 = sqlsrv_query( $conn, $sql1 , $params, $options );
if( $stmt1 === false ) {
    die( print_r( sqlsrv_errors(), true));
}
//Secondo Ciclo, ricerco il primo contratto rinnovato
while($obj1 = sqlsrv_fetch_object($stmt1)) {
    /**Imposto i valori del primo contratto rinnovato */
    $contrattotoupdate=$obj1->IDCONTRATTO;
    $sezionetoupdate=$obj1->SEZIONECONTRATTO;
    $ore_inttoupdate=$obj1->ORE_INT;
   

    $sqlu = "INSERTINTO BiriOreSezUpdatedLog(IDCONTRATTOBASE, CodiceSezUpdatedBASE, OreSezUpdatedBASE, IDCONTRATTOBASETU, CodiceSezTU, OreSezBefore)
VALUES        ( ?, ?, ?, ?, ?, ? )";
    $params4 = array($contratto, $sezione, $oreupdated,$contratto4,$sezione4, $oreint4);
    $stmtU4 = sqlsrv_query( $conn, $sqlu4, $params4);


    }
//FIne sEcondo ciclo
}
sqlsrv_close($conn);


?>