Partager via


O2SS0021 : Instruction avec ROWNUM non convertie (Erreur)

Cet article décrit certaines des raisons pour lesquelles Assistant Migration SQL Server (SSMA) pour Oracle ne peut pas convertir une instruction qui contient le pseudocolumn OracleROWNUM.

Background

ROWNUM Oracle retourne un nombre indiquant l’ordre dans lequel une ligne a été sélectionnée dans une table. La première ligne sélectionnée a un ROWNUM de 1; la deuxième ligne a un ROWNUM , 2et ainsi de suite.

Quand SSMA convertit le ROWNUM pseudocolumn, il fournit deux formes d’émulation :

  1. Avec le TOP mot clé de l’instruction SELECT , si ce pseudocolumn est utilisé uniquement pour limiter la taille du jeu de résultats.
  2. Avec la ROW_NUMBER() fonction, si les numéros de ligne apparaissent dans une SELECT liste.

Il existe deux cas où SSMA décide qu’il ne peut pas convertir le ROWNUM pseudocolumn en SQL Server et génère donc le O2SS0021 message d’erreur :

Scénario 1 : ROWNUM est inclus dans le cadre d’une clause complexe WHERE .

Scénario 2 : ROWNUM est utilisé dans une WHERE clause semblable à ceci : WHERE ROWNUM > {positive integer}.

Solutions possibles

Scénario 1 : ROWNUM est inclus dans le cadre d’une clause complexe WHERE

Prenons l’exemple suivant :

DELETE
    FROM employees
WHERE
    ROWNUM - 1 <= 11 + 1
    AND employeeid > 10;

La solution consiste à simplifier l’expression pour l’être ROWNUM ROWNUM <= 11. Le résultat final se traduit par l’utilisation de la TOP clause. Une requête simplifiée suit :

DELETE
    FROM employees
WHERE
    ROWNUM <= 11
    AND employeeid > 10;

SSMA convertit cette requête comme suit :

DELETE TOP(11)
    [dbo].[EMPLOYEES]
WHERE
    [EMPLOYEES].[EMPLOYEEID] > 10

Dans l’exemple suivant, SSMA ne sait pas comment analyser ROWNUM la IN clause :

DELETE
    FROM employees
WHERE
    ROWNUM in (1, 2, 3, 4);

Au lieu de tenter de traduire cette clause littéralement, envisagez d’utiliser une WHERE clause qui utilise la clé primaire ou un identificateur unique, en particulier lorsqu’il n’existe aucune ORDER BY clause. Par exemple, utilisez la colonne employeeid clé primaire au lieu de ROWNUM ce qui suit :

DELETE
    FROM employees
WHERE
    employeeid IN (1, 2, 3, 4);

Scénario 2 : ROWNUM est utilisé dans une WHERE clause semblable à ceci : WHERE ROWNUM > {positive integer}

Prenons l’exemple suivant :

SELECT
    employeeid
FROM
    employees
WHERE
    ROWNUM > 2 OR employeeid > 8;

Chaque fois que vous utilisez ROWNUM > {positive integer}, l’expression prend toujours la valeur false. SSMA signale le problème à l’aide de l’erreur O2SS0021. Pour résoudre ce problème, supprimez l’expression ROWNUM > 2 .

Dans la plupart de ces situations, tenez compte de ce que la requête tente d’accomplir et de réécrire pour utiliser l’émulationROW_NUMBER(), TOP la clause ou utiliser une expression unique pour vos clauses ou GROUP BYORDER BY vos WHEREclauses.