Entendendo as diferenças entre os níveis de compatibilidade 80 e 90

A dica de hoje tem o objetivo de ilustrar e apresentar as diferenças existentes entre os Níveis de Compatibilidade 80(SQL Server 2000) e 90(SQL Server 2005).

No nível de compatibilidade 90, ocorremas alterações de comportamento a seguir.

Configuração
de nível de compatibilidade 80

Configuração
de nível de compatibilidade 90

Possibilidade
de impacto

Para bloquear as dicas na cláusula
FROM, a palavra-chave WITH é sempre opcional.
Com algumas exceções, há suporte para
dicas de tabela na cláusula FROM somente quando elas são especificadas com a
palavra-chave WITH. Para obter mais informações, consulte FROM
(Transact-SQL).
Alta
Os operadores * = e = * para junção
externa possuem suporte com uma mensagem de aviso.
Esses operadores não têm suporte; a palavra-chave
OUTER JOIN deve ser usada.
Alta
Ao associar as referências de coluna
na lista ORDER BY com as colunas definidas na lista SELECT, as ambiguidades
de coluna são ignoradas e os prefixos de colunas, às vezes, são ignorados.
Isso pode fazer o conjunto de resultados ser retornado em uma ordem inesperada.

Por exemplo, uma cláusula ORDER BY
com uma única coluna de duas partes (<table_alias>.<column>)
que é usada como uma referência a uma coluna em uma lista SELECT é aceita,
mas o alias de tabela é ignorado.
Considere a consulta a seguir.

SELECT c1 =
-c1 FROM t_table AS x ORDER BY x.c1

Quando executada, o prefixo de coluna
será ignorado em ORDER BY. A operação de classificação não ocorre na coluna
de origem especificada (x.c1) conforme esperado; em vez disso, ela ocorre na
coluna c1 derivada que é definida na consulta. O plano de execução dessa
consulta mostra que, primeiro, os valores para a coluna derivada são
computados e, em seguida, os valores computados são classificados.

Erros são gerados em ambiguidades de
coluna. Os prefixos de coluna, se houver, especificados em ORDER BY não são
ignorados ao serem associados a uma coluna definida na lista SELECT.

Considere a consulta a seguir.

SELECT c1 =
-c1 FROM t_table AS x ORDER BY x.c1

Quando executada, o prefixo de coluna
na cláusula ORDER BY não é ignorado. A operação de classificação ocorre na
coluna de origem especificada (x.c1) conforme esperado. O plano de execução
para essa consulta mostra que o operador de classificação ordena as linhas
retornadas de t_table e, em seguida, os valores para a coluna derivada c1
definida na lista SELECT são computados.

Média
Em um INSERT SELECT de uma UNION de
diferentes tipos de dados, cada ramificação UNION é convertida diretamente
para o tipo de coluna de destino de INSERT. Mesmo que a união usada sozinha
possa falhar por causa de conversões de tipos incompatíveis, INSERT SELECT
faz com que UNION tenha êxito porque a ramificação para o tipo de resultado
de UNION nunca é convertida.
O tipo de resultado de UNION é derivado
independentemente de INSERT SELECT. Cada ramificação de UNION é convertida
para o tipo de resultado UNION e, em seguida, convertida para o tipo de
coluna de destino de INSERT. Se houver tipos incompatíveis na UNION, a
primeira conversão poderá causar um erro. Para executar no nível de
compatibilidade 90, é necessário corrigir todas as uniões de tipos incompatíveis
usadas em INSERT SELECT.
Média
As operações de inserção e
atualização em uma exibição possuem suporte incorreto em exibições que
especificam a cláusula WITH CHECK OPTION quando a exibição ou uma exibição
referenciada usa a cláusula TOP.
Essas operações em uma exibição não
possuem suporte em exibições que usam WITH CHECK OPTION quando a exibição ou
uma exibição referenciada usa a cláusula TOP.
Média
A UNION de uma coluna de comprimento
variável e uma coluna de comprimento fixo produz uma coluna de comprimento
fixo.
A UNION de uma coluna de comprimento variável e
uma coluna de comprimento fixo produz uma coluna de comprimento variável.
Média
SET XACT_ABORT OFF é permitido em um
gatilho.
SET XACT_ABORT OFF não é permitido em
um gatilho.
Média
A cláusula FOR BROWSE é permitida (e
ignorada) em exibições.
A cláusula FOR BROWSE não é permitida em
exibições.
Média
Erros de domínio não são controlados
por ANSI_WARNINGS. As configurações ARITHABORT são obedecidas, se
ANSI_WARNINGS for definido como OFF e não houver nenhuma alteração em
ARITHABORT.
Erros de domínio também são
controlados por ANSI_WARNINGS e são erros de severidade 16. Se ANSI_WARNINGS
ou ARITHABORT forem ON, um erro será lançado em vez de retornar o valor NULL.
Scripts de usuário que dependem de ARITHABORT ser definido como OFF podem ser
divididos por essa alteração.
Média
Se uma consulta de passagem em uma
fonte de dados remota (OpenRowset ou OpenQuery) produzir colunas com nomes
duplicados, os nomes de coluna duplicados serão ignorados a menos que as
colunas sejam nomeadas explicitamente na consulta.
Se uma consulta de passagem em uma fonte de dados
remota (OpenRowset ou OpenQuery) produzir uma coluna com nomes de coluna
duplicados, um erro será gerado.
Baixa
Constantes de cadeia de caracteres e
constantes varbinary maiores que 8.000 são tratadas como text, ntext ou
image.
As constantes de cadeia de caracteres
e as constantes varbinary maiores que 8.000 são tratadas como tipo varchar(max)
(ou nvarchar(max) e varbinary(max), respectivamente). Isso pode
alterar o tipo de dados da tabela criada usando SELECT … INTO se a lista
SELECT contiver tais expressões.
Baixa
As comparações entre tipos numéricos
(smallint, tinyint, int, bigint, numeric, decimal, smallmoney e money) são
feitas convertendo o termo de comparação com a menor precedência na
hierarquia de tipos com o tipo cuja precedência seja maior.
Os valores de tipo numérico são comparados sem
conversões. Isso melhora o desempenho. Entretanto, pode causar algumas
alterações de comportamento, principalmente em casos nos quais a conversão
causou exceções de estouro.
Baixa
Funções de metadados internas que
fazem argumentos de cadeia de caracteres truncarem a entrada se ela tiver
mais que 4.000 caracteres.
As funções de metadados internas irão
gerar um erro se o truncamento resultar na perda de caracteres sem-espaço.
Baixa
O conjunto de caracteres não
permitidos em um identificador sem-aspas permanece inalterado.
O analisador Transact-SQL oferece suporte ao padrão
Unicode 3.2, que altera a classificação de caracteres para alguns caracteres
internacionais que agora são proibidos em identificadores não delimitados.
Baixa
SET ANSI_WARNINGS ON não substitui a
configuração de SET ARITHABORT OFF para o caso de erros de domínio de ponto
flutuante [ou seja, argumentos negativos para a função log()] Se
ANSI_WARNINGS for ON mas ARITHABORT for OFF, os erros de domínio de ponto
flutuante não causarão o encerramento da consulta.
SET
ANSI_WARNINGS ON substitui completamente a configuração ARITHABORT OFF. Os
erros de domínio de ponto flutuante nesse caso farão a consulta ser
encerrada.
Baixa
Constantes não inteiras são
permitidas (e ignoradas) na cláusula ORDER BY.
As constantes não inteiras não são permitidas na
cláusula ORDER BY.
Baixa
A instrução SET vazia (sem nenhuma
atribuição de opção SET) é permitida.
A cláusula SET vazia não é permitida. Baixa
O atributo IDENTITY não é derivado
corretamente para colunas produzidas por uma tabela derivada.
O atributo IDENTITY é derivado corretamente para
colunas produzidas por tabelas derivadas.
Baixa
A propriedade de nulidade de
operadores aritméticos no tipo de dados de ponto flutuante sempre pode ser
nula.
A propriedade de nulidade de
operadores aritméticos no tipo de dados de ponto flutuante será alterada para
não nula caso as entradas sejam não nulas e ANSI_WARNINGS seja ON.
Baixa
Na instrução INSERT … SELECT com
UNION, os tipos produzidos pelos conjuntos de resultados individuais são
todos convertidos no tipo de resultado de destino.
Na instrução INSERT … SELECT com UNION, o tipo
dominante das diversas ramificações é determinado, e os resultados são
convertidos naquele tipo existente antes de serem convertidos no tipo de
tabela de destino.
Baixa
Na instrução SELECT … FOR XML, o
hex(27) (o caractere ‘) e hex(22) (o caractere “) têm sempre a entidade
definida, mesmo quando não é necessário.
FOR XML tem a entidade definida como
hex(27) e hex(22) somente quando necessário. Eles não têm a entidade definida
nas seguintes situações:

  • No conteúdo de atributo, hex(27) (o caractere )
    não tem a entidade definida se os valores de atributo forem delimitados com ,
    e hex(22) (o caractere ) não tem a entidade definida se os
    valores de atributo forem delimitados com .
  • No conteúdo de elemento, hex(27) e hex(22) nunca
    têm a entidade definida.
Baixa
Em FOR XML, o valor de carimbo de
data/hora é mapeado como um inteiro.
Em FOR XML, o valor de carimbo de data/hora é
mapeado como um valor binário.

Para obter mais informações, consulte Suporte de
FOR XML para o tipo de dados timestamp.

Alta (se uma coluna timestamp for usada);
caso contrário, Baixa
Em FOR XML e OPENXML, os caracteres
Unicode (de 3 bytes) de intervalo grande em nomes são representados usando 8
posições.

Por exemplo, usando 8 posições, FOR
XML representa o ponto de código Unicode U+10000 como:

<a_x00010000_ c1=”1″
/>

Em FOR XML e OPENXML, os caracteres
Unicode (de 3 bytes) de intervalo grande em nomes são representados usando 6
posições.

Por exemplo, usando 6 posições, FOR
XML representa o ponto de código Unicode U+10000 como:

<a_x010000_ c1=”1″ />

Baixa
Em FOR XML, os mapeamentos de tabela
derivados no modo AUTO são tratados de forma transparente.

Por exemplo:

 
USE AdventureWorks2008R2;

CREATE TABLE Test(id int);

INSERT INTO Test VALUES(1);

INSERT INTO Test VALUES(2);

SELECT * FROM (SELECT a.id AS a,

b.id AS b FROM Test a

JOIN Test b ON a.id=b.id)

Test
FOR XML AUTO;

Quando o nível de compatibilidade
para AdventureWorks2008R2 for definido como 80, o exemplo anterior produzirá:

<a a=”1″><b
b=”1″/></a>

<a a=”2″><b
b=”2″/></a>

Em FOR XML, os mapeamentos de tabela derivados no
modo AUTO são tratados de forma opaca.

Quando o nível de compatibilidade para AdventureWorks2008R2
for definido como 90, o exemplo anterior produzirá:

<Test a=”1″
b=”1″/>

<Test a=”2″
b=”2″/>

Alta (se o modo FOR XML AUTO for aplicado em
exibições); caso contrário, Baixa
A cadeia de caracteres para
conversões de money oferecem suporte ao uso de um caractere de barra
invertida (\) como símbolo de moeda somente nos idiomas japonês e coreano.
O caractere de barra invertida (\) é
aceito em toda a cadeia de caracteres para conversões de money em
todos os idiomas. ISNUMERIC retorna verdadeiro quando \ é usada como um
símbolo de moeda.

Para bancos de dados em versões do
SQL Server anteriores ao SQL Server 2005, esse novo comportamento interrompe
índices e colunas computadas que dependem de um valor de retorno ISNUMERIC
contendo \ e para o qual o idioma não é nem japonês nem coreano.

Baixa
O resultado de um operador aritmético
sempre pode ser nulo, mesmo que os operandos não possam ser nulos e
ANSI_WARNINGS ou ARITHABORT sejam definidos como ON.
Quando ANSI_WARNINGS ou ARITHABORT são definidos como
ON, o resultado de um operador aritmético de ponto flutuante não poderá ser
nulo se os dois operandos não puderem ser nulos.

Essa alteração em nulidade pode causar falha
quando bcp for usado para exportar dados em massa que usam o formato
binário de uma tabela do SQL Server 2000 com uma coluna computada que usa um
operador aritmético de ponto flutuante e, em seguida, bcp ou BULK
INSERT for usado para importar em massa os dados de uma tabela do SQL Server
2005 com a mesma definição.

Observação:

Quando as duas opções forem OFF, o Mecanismo de
Banco de Dados marcará o resultado indicando que ele permite valor nulo. O
mesmo acontece no SQL Server 2000.
Baixa
Para funções internas que usam
nvarchar como um parâmetro, se o valor fornecido for varchar, ele será
convertido em nvarchar(4.000). No SQL Server 2000, se um valor maior for
passado, ele será truncado silenciosamente.
Para funções internas que usam nvarchar
como um parâmetro, se o valor fornecido for varchar, ele ainda será
convertido em nvarchar(4.000). Entretanto, se um valor maior for
passado, o SQL Server 2008 irá gerar um erro.

Para a execução com o nível de
compatibilidade 90, será necessário corrigir qualquer código personalizado
que dependa do comportamento de truncamento.

Baixa
Uma união de uma cadeia de caracteres
de tamanho fixo (char, binary ou nchar) com uma cadeia de caracteres de
comprimento variável (varchar, varbinary, nvarchar) retorna um resultado de
tamanho fixo.
A união de uma cadeia de caracteres de tamanho
variável com uma cadeia de caracteres de tamanho fixo retorna uma cadeia de
caracteres de tamanho variável.

Para a execução com o nível de compatibilidade
90, será necessário corrigir todos os itens (índices, consultas e colunas
computadas) que dependem do tipo resultante de uma união de um tipo de
tamanho variável e um tipo de tamanho fixo.

Baixa
Nomes de objeto contendo o caractere
0xFFFF são identificadores válidos.
Nomes de objeto contendo o caractere
0xFFFF não são identificadores válidos e não são acessados.

Para a execução com nível de
compatibilidade 90, será necessário renomear objetos que contêm esse
caractere.

Baixa
Em SELECT ISNUMERIC(‘<string>‘),
as vírgulas incorporadas em <string> são significativas.

Por exemplo, a consulta SELECT
ISNUMERIC(‘121212,12’) a seguir retorna 0. Isso indica que a cadeia de
caracteres 121212,12 não é numérica.

Em SELECT ISNUMERIC(‘<string>‘), as
vírgulas incorporadas em <string> são ignoradas.

Por exemplo, a consulta SELECT
ISNUMERIC(‘121212,12’) a seguir retorna 1. Isto indica que a cadeia de
caracteres 121212,12 é numérica.

Baixa
Um sinal de dois-pontos (:) após de
uma palavra-chave reservada em uma instrução Transact-SQL é ignorado.
Um sinal de dois-pontos (:) após uma
palavra-chave reservada em uma instrução Transact-SQL causa a falha da
instrução.
Baixa
Uma cláusula GROUP BY em uma
subconsulta que faz referência a uma coluna da consulta externa é
bem-sucedida.
Uma cláusula GROUP BY em uma subconsulta que faz
referência a uma coluna da consulta externa retorna um erro de acordo com o
padrão SQL.
Baixa

Até mais.

Este post foi publicado em Dicas, VIRTUAL PASS BR e marcado com a tag , em por .

Sobre Junior Galvão - MVP

Profissional com vasta experiência na área de Tecnologia da Informação e soluções Microsoft. Mestre em Ciências Ambientes na linha de pesquisa em Geoprocessamento e Modelagem Matemática pela Universidade Estadual Paulista "Júlio de Mesquita Filho". Pós-Graduado no Curso de Gestão e Engenharia de Processos para Desenvolvimento de Software com RUP na Faculdade FIAP – Faculdade de Informática e Administração Paulista de São Paulo. Graduado no Curso Superior em Gestão da Tecnologia de Sistemas de Informação pela Uninove – Campus São Roque. Formação MCDBA Microsoft, autor de artigos acadêmicos e profissionais postados em Revistas, Instituições de Ensino e WebSistes. Meu primeiro contato com tecnologia ocorreu em 1994 após meus pais comprarem nosso primeiro computador, ano em que as portas para este fantástico mundo se abriram. Neste mesmo ano, comecei o de Processamento de Dados, naquele momento a palavra TI não existia, na verdade a Tecnologia da Informação era conhecida como Computação ou Informática, foi assim que tudo começou e desde então não parei mais, continuando nesta longa estrada até hoje. Desde 2001 tenho atuado como Database Administrator – Administrador de Banco de Dados – SQL Server em tarefas de Administração, Gerenciamento, Migração de Servidores e Bancos de Dados, Estratégias de Backup/Restauração, Replicação, LogShipping, Implantação de ERPs que utilizam bancos SQL Server, Desenvolvimento de Funções, Stored Procedure, entre outros recursos. Desde 2008 exerço a função de Professor Universitário, para as disciplinas de Banco de Dados, Administração, Modelagem de Banco de Dados, Programação em Banco de Dados, Sistemas Operacionais, Análise e Projetos de Sistemas, entre outras. Experiência na Coordenação de Projetos de Alta Disponibilidade de Dados, utilizando Database Mirroring, Replicação Transacional e Merge, Log Shipping, etc. Trabalhei entre 2011 e 2017 como Administrador de Banco de Dados e Coordenador de TI no FIT – Instituto de Tecnologia da Flextronics, atualmente exerço a função de Professor Universitário na FATEC São Roque. CTO da Galvão Tecnologia, consultoria especializada em Gestão de TI, Administração de Servidores Windows Server, Bancos de Dados Microsoft SQL Server e Virtualização. Possuo titulação Oficial Microsoft MVP e reconhecimentos: MCC, MSTC, MIE e MTAC.