Compartilhar via


O2SS0021: Instrução com ROWNUM não convertido (Erro)

Este artigo aborda alguns dos motivos pelos quais o SSMA (Assistente de Migração do SQL Server) para Oracle não pode converter uma instrução que contém a pseudocoluna Oracle ROWNUM .

Tela de fundo

O Oráculo ROWNUM retorna um número indicando a ordem em que uma linha foi selecionada em uma tabela. A primeira linha selecionada tem um ROWNUM de 1; a segunda linha tem um ROWNUM de 2, e assim por diante.

Quando o SSMA converte a ROWNUM pseudocoluna, ele fornece duas formas de emulação:

  1. Com a TOP palavra-chave da SELECT instrução, se essa pseudocoluna for usada apenas para limitar o tamanho do conjunto de resultados.
  2. Com a ROW_NUMBER() função, se os números das linhas aparecerem em uma SELECT lista.

Há dois casos em que o SSMA decide que não pode converter a ROWNUM pseudocoluna em SQL Server e, portanto, gera a mensagem de O2SS0021 erro:

Cenário 1: ROWNUM é incluído como parte de uma cláusula complexa WHERE .

Cenário 2: ROWNUM é usado em uma WHERE cláusula como esta: WHERE ROWNUM > {positive integer}.

Possíveis soluções

Cenário 1: ROWNUM é incluído como parte de uma cláusula complexa WHERE

Considere o seguinte exemplo:

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

A solução é simplificar a expressão para que o ROWNUM .ROWNUM <= 11 O resultado final seria traduzido para usar a TOP cláusula. Uma consulta simplificada segue:

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

O SSMA converte essa consulta da seguinte maneira:

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

No próximo exemplo, o SSMA não sabe como analisar ROWNUM com a IN cláusula:

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

Em vez de tentar traduzir essa cláusula literalmente, considere usar uma WHERE cláusula que use a chave primária ou um identificador exclusivo, especialmente quando não houver cláusula ORDER BY . Por exemplo, use a coluna employeeid de chave primária em vez da ROWNUM seguinte:

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

Cenário 2: ROWNUM é usado em uma WHERE cláusula como esta: WHERE ROWNUM > {positive integer}

Considere o seguinte exemplo:

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

Sempre que você usa ROWNUM > {positive integer}, a expressão sempre é avaliada como false. O SSMA relata o problema usando o erro O2SS0021. Para resolver esse problema, remova a ROWNUM > 2 expressão.

Na maioria dessas situações, considere o que a consulta está tentando realizar e reescreva-a para usar a ROW_NUMBER() emulação, TOP cláusula ou usar uma expressão exclusiva para suas WHEREcláusulas , GROUP BY, or ORDER BY .