Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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
, 2
et ainsi de suite.
Quand SSMA convertit le ROWNUM
pseudocolumn, il fournit deux formes d’émulation :
- Avec le
TOP
mot clé de l’instructionSELECT
, si ce pseudocolumn est utilisé uniquement pour limiter la taille du jeu de résultats. - Avec la
ROW_NUMBER()
fonction, si les numéros de ligne apparaissent dans uneSELECT
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
.
Messages de conversion connexes
- O2SS0039 : le pseudocolumn ROWNUM ne peut pas être converti
- O2SS0081 : astérisque non pris en charge et ROWNUM dans les instructions SELECT
- O2SS0099 : ROWNUM dans la clause ORDER BY n’est pas pris en charge (Erreur)
- O2SS0412 : ROWNUM avec GROUPING SETS ne peut pas être converti
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 BY
ORDER BY
vos WHERE
clauses.