Domanda

Prova di migrare da MSSQL a MySQL. Questo Proc memorizzato sta creando una tabella temporanea per alcune colonne da una tabella permanente, quindi utilizzando un cursore per aggiornare la colonna RandNum di ogni record con un numero casuale e seleziona il set di dati. Mentre scrivo, ho pensato di poter bypassare il cursore e solo ...

SELECT Id, Title, DateStart, Rand() FROM cms_News;

Ma non voglio cambiare nulla di troppo drastico, perché in questo momento sto solo cercando di convertire il DB. Tornerò indietro e ottimizzerò queste cose in seguito. Ecco l'SP: EDIT: ho rimosso tutto il codice da questo esempio che non ha nulla a che fare con l'errore. Inoltre, ho visto questo online oggi e sembra che io sia non l'unico che ha questo problema. A MySQL non piace la sintassi della mia dichiarazione del cursore. Qualche idea?

DELIMITER ;//

DROP PROCEDURE IF EXISTS `cms_NewsSelectMainPageNews`;//
CREATE PROCEDURE `cms_NewsSelectMainPageNews`
()
BEGIN
  CREATE TEMPORARY TABLE tempNews
  (
    Id int NOT NULL, 
    Title nvarchar(250),
    DateStart datetime,
    RandNum float NULL
  );

  DECLARE Randomizer CURSOR
      FOR SELECT Id FROM tempNews;
END;//
È stato utile?

Soluzione

  REPEAT
    FETCH Randomizer INTO cursor_id;
    IF NOT done THEN
      UPDATE tempNews SET RandNum = rand();
       WHERE id = @cursor_id;
    END IF;
  UNTIL done END REPEAT;

Stai usando la variabile di sessione unitaria @cursor_id invece della variabile dichiarata dalla procedura cursor_id

Riscrivi come segue:

  REPEAT
    FETCH Randomizer INTO cursor_id;
    IF NOT done THEN
      UPDATE tempNews SET RandNum = rand();
       WHERE id = cursor_id;
    END IF;
  UNTIL done END REPEAT;

o meglio ancora, sbarazzati del tuo tavolo temporaneo, come hai suggerito in primo luogo.


Come per questa affermazione:

  

Ma non voglio cambiare nulla di troppo drastico, perché in questo momento sto solo cercando di convertire il DB. Tornerò indietro e ottimizzerò queste cose in seguito.

SQL Server e MySQL sono ampiamente piattaforme diverse.

Hai già cambiato tutto troppo drasticamente quando hai deciso di cambiare.

Nella maggior parte dei casi non puoi semplicemente copiare il tuo vecchio codice e martellarlo su MySQL .

Probabilmente funzionerebbe tra diverse versioni di SQL Server , poiché almeno ci sono tentativi di mantenere un qualche tipo di compatibilità tra le versioni della stessa piattaforma, ma questo sicuramente non funzionerà per il porting su MySQL .

Quello che vorrei fare è prendere ogni parte del tuo codice e assicurarmi che produca gli stessi risultati del codice precedente, usando metodi nel modo più semplice e prevedibile possibile .

Nel tuo caso, la variabile @cursor_id potrebbe essere inizializzata in precedenza nel codice e il suo valore potrebbe essere utilizzato dalla procedura memorizzata, il che porterebbe a qualsiasi tipo di comportamento imprevisto.

Questo perché in SQL Server le variabili hanno un ambito batch, mentre in MySQL hanno un ambito di sessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top