Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
- Com a
TOP
palavra-chave daSELECT
instrução, se essa pseudocoluna for usada apenas para limitar o tamanho do conjunto de resultados. - Com a
ROW_NUMBER()
função, se os números das linhas aparecerem em umaSELECT
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.
Mensagens de conversão relacionadas
- O2SS0039: A pseudocoluna ROWNUM não pode ser convertida
- O2SS0081: Asterisco e ROWNUM não suportados em instruções SELECT
- O2SS0099: ROWNUM na cláusula ORDER BY não é suportado (Erro)
- O2SS0412: ROWNUM com GROUPING SETS não pode ser convertido
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 WHERE
cláusulas , GROUP BY
, or ORDER BY
.