Nível de compatibilidade de ALTER DATABASE (Transact-SQL)

Define certos comportamentos de banco de dados como sendo compatíveis com a versão especificada do SQL Server. Nova no SQL Server 2008, a sintaxe ALTER DATABASE a seguir substitui o procedimento sp_dbcmptlevel para definir o nível de compatibilidade de banco de dados. Para outras opções ALTER DATABASE, consulte ALTER DATABASE (Transact-SQL).

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

ALTER DATABASE database_name 
SET COMPATIBILITY_LEVEL = { 80 | 90 | 100 }

Argumentos

  • database_name
    É o nome do banco de dados a ser modificado.

  • COMPATIBILITY_LEVEL { 80 | 90 | 100 }
    É a versão do SQL Server com a qual o banco de dados será compatível. O valor deve ser um dos seguintes:

    80 = SQL Server 2000

    90 = SQL Server 2005

    100 = SQL Server 2008

Comentários

Para todas as instalações do SQL Server 2008, o nível de compatibilidade padrão é 100. Bancos de dados criados no SQL Server 2008 são definidos com esse nível a não ser que o banco de dados modelo tenha um nível de compatibilidade inferior. Quando um banco de dados for atualizado para o SQL Server 2008 a partir de qualquer versão anterior do SQL Server, o banco de dados manterá seu nível de compatibilidade se ele for pelo menos 80. Atualizar um banco de dados com um nível de compatibilidade inferior a 80 definirá o banco de dados com o nível de compatibilidade 80. Isso se aplica aos bancos de dados do sistema e de usuário. Use ALTER DATABASE para alterar o nível de compatibilidade do banco de dados. Para exibir o nível de compatibilidade atual de um banco de dados, consulte a coluna compatibility_level na exibição do catálogo sys.databases.

Usando o nível de compatibilidade para compatibilidade com versões anteriores

O nível de compatibilidade afeta os comportamentos apenas do banco de dados especificado e não do servidor inteiro. O nível de compatibilidade oferece apenas compatibilidade parcial com versões anteriores do SQL Server. Use o nível de compatibilidade como um auxílio de migração provisório ao trabalhar com diferenças de versões nos comportamentos que são controlados pela definição de nível de compatibilidade relevante. Se os aplicativos existentes do SQL Server forem afetados pelas diferenças de comportamento no SQL Server 2008, converta o aplicativo para trabalhar adequadamente. Em seguida, use ALTER DATABASE para alterar o nível de compatibilidade para 100. A nova definição de compatibilidade para um banco de dados entrará em vigor quando o banco de dados passar a ser o atual (como banco de dados padrão no logon ou ao ser especificado em uma instrução USE).

Práticas recomendadas

Alterar o nível de compatibilidade enquanto os usuários estão conectados ao banco de dados pode gerar conjuntos de resultados incorretos para consultas ativas. Por exemplo, se o nível de compatibilidade for alterado enquanto um plano de consulta estiver sendo compilado, o plano compilado poderá basear-se nos níveis de compatibilidade antigos e novos, gerando um plano incorreto e, provavelmente, resultados imprecisos. Além disso, o problema pode ser maior se o plano for colocado no cache de planos e reutilizado em consultas subseqüentes. Para evitar resultados de consulta imprecisos, recomendamos o seguinte procedimento ao alterar o nível de compatibilidade de um banco de dados:

  1. Defina o banco de dados para o modo de acesso de usuário único, usando ALTER DATABASE SET SINGLE_USER.

  2. Altere o nível de compatibilidade do banco de dados.

  3. Coloque o banco de dados no modo de acesso multiusuário usando ALTER DATABASE SET MULTI_USER.

  4. Para obter mais informações sobre como definir o modo de acesso de um banco de dados, consulte ALTER DATABASE (Transact-SQL).

Opções SET

A nova funcionalidade pode funcionar em níveis de compatibilidade antigos, mas as opções SET podem precisar de ajustes. Por exemplo, usar o tipo de dados xml no nível de compatibilidade 80 requer as opções ANSI SET apropriadas. Além disso, quando o nível de compatibilidade do banco de dados estiver definido como 90 ou mais, configurar ANSI_WARNINGS como ON definirá ARITHABORT implicitamente como ON. Se o nível de compatibilidade do banco de dados for definido como 80, a opção ARITHABORT deverá ser definida explicitamente como ON. Para obter mais informações, consulte Opções SET que afetam os resultados.

Níveis de compatibilidade e procedimentos armazenados

Quando um procedimento armazenado é executado, ele usa o nível de compatibilidade atual do banco de dados no qual está definido. Quando a configuração de compatibilidade de um banco de dados é alterada, todos os seus procedimentos armazenados são recompilados automaticamente conforme necessário.

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

Esta seção descreve os novos comportamentos introduzidos com o nível de compatibilidade 90.

No nível de compatibilidade 90, ocorrem as 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 ambigüidades 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 para 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 ambigüidades 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 é ignorado em um gatilho. A opção é sempre definida como ON.

SET XACT_ABORT pode ser definido como OFF 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 AdventureWorks
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 AdventureWorks 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 AdventureWorks 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çãoObservaçã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

Diferenças entre níveis de compatibilidade inferiores e o nível 100

Esta seção descreve os novos comportamentos introduzidos com o nível de compatibilidade 100.

Configuração de nível de compatibilidade 90 ou inferior

Configuração de nível de compatibilidade de 100

Possibilidade de impacto

A configuração QUOTED_IDENTIFER sempre é definida como ON para funções com valor de tabela de várias instruções ao serem criadas, sem considerar a configuração do nível de sessão.

A configuração de sessão QUOTED IDENTIFIER é atendida quando funções com valor de tabela de várias instruções são criadas.

Média

Ao criar ou alterar uma função de partição, datetime e literais de smalldatetime na função são avaliados assumindo US_English como a configuração de idioma.

A configuração atual de idioma é usada para avaliar datetime e literais de smalldatetime na função de partição.

Média

A cláusula FOR BROWSE é permitida (e ignorada) nas instruções INSERT e SELECT INTO.

A cláusula FOR BROWSE não é permitida em instruções INSERT SELECT INTO.

Média

Predicados de texto completo são permitidos na cláusula OUTPUT.

Predicados de texto completo não são permitidos na cláusula OUTPUT.

Baixa

CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST e DROP FULLTEXT STOPLIST não recebem suporte. A lista de palavras irrelevantes do sistema é associada automaticamente a novos índices de texto completo.

CREATE FULLTEXT STOPLIST, ALTER FULLTEXT STOPLIST e DROP FULLTEXT STOPLIST recebem suporte.

Baixa

MERGE não é imposto como uma palavra-chave reservada.

MERGE é uma palavra-chave completamente reservada. A instrução MERGE é suportadas nos níveis de compatibilidade 100 e 90.

Baixa

O uso do argumento <dml_table_source> da instrução INSERT aumenta um erro de sintaxe.

Além disso, você pode capturar os resultados de uma cláusula OUTPUT em uma instrução INSERT, UPDATE, DELETE ou MERGE aninhada e inserir esses resultados em uma tabela ou exibição de destino. Isto é feito usando o argumento <dml_table_source> da instrução INSERT.

Baixa

A menos que NOINDEX esteja especificado, DBCC CHECKDB ou DBCC CHECKTABLE executará verificações de consistência física e lógica em uma única tabela ou exibição indexada e em todos os índices não clusterizados e XML. Não há suporte para índices espaciais.

A menos que NOINDEX esteja especificado, DBCC CHECKDB ou DBCC CHECKTABLE executará verificações de consistência física e lógica em uma única tabela e em todos os índices não clusterizados. Entretanto, em índices XML, índices espaciais e exibições indexadas, por padrão são executadas somente as verificações de consistência física.

Se WITH EXTENDED_LOGICAL_CHECKS estiver especificado, verificações lógicas serão executadas em exibições indexadas, em índices XML e em índices espaciais, quando presentes. Por padrão, as verificações de consistência física são executadas antes das verificações de consistência lógica. Se NOINDEX também estiver especificado, apenas as verificações lógicas serão executadas.

Baixa

Quando uma cláusula OUTPUT é usada com uma instrução DML que causa um erro de tempo de execução durante sua execução, a transação inteira é encerrada e revertida.

Quando uma cláusula OUTPUT é usada com uma instrução DML que causa um erro de tempo de execução durante sua execução, o comportamento depende da configuração em SET XACT_ABORT. Se SET XACT_ABORT estiver OFF, um erro de cancelamento de instrução gerado pela instrução DML usando a cláusula OUTPUT encerrará a instrução, mas a execução do lote continuará e a transação não será revertida. Se SET XACT_ABORT estiver como ON, todos os erros de tempo de execução gerados pela instrução DML usando a cláusula OUTPUT encerrarão o lote e a transação será revertida.

Baixa

CUBE e ROLLUP não são impostos como palavras-chave reservadas.

CUBE e ROLLUP são palavras-chave reservadas dentro da cláusula GROUP BY.

Baixa

A validação restrita é aplicada a elementos do tipo anyType de XML.

A validação incerta é aplicada a elementos do tipo anyType de XML. Para obter mais informações, consulte Componentes curinga e validação de conteúdo.

Baixa

Não é possível consultar ou modificar os atributos especiais xsi:nil e xsi:type através de instruções de linguagem de manipulação de dados.

Isto significa que /e/@xsi:nil falhará enquanto /e/@* ignorará os atributos xsi:nil e xsi:type. Entretanto, /e retorna os atributos xsi:nil e xsi:type para verificar a consistência com SELECT xmlCol, mesmo se xsi:nil = "false".

Os atributos especiais xsi:nil e xsi:type são armazenados como atributos normais e podem ser consultados e modificados.

Por exemplo, executar a consulta SELECT x.query('a/b/@*') retorna todos os atributos, inclusive xsi:nil e xsi:type. Para excluir estes tipos da consulta, substitua @* por @*[namespace-uri(.) != "inserir URI de espaço para nome xsi" e não por (local-name(.) = "type" ou local-name(.) ="nil".

Baixa

Uma função definida pelo usuário que converte um valor constante da cadeia de caracteres XML para um tipo de datetime do SQL Server é marcada como determinista.

Uma função definida pelo usuário que converte um valor constante de cadeia de caracteres XML em um tipo datetime do SQL Server é marcado como não-determinista.

Baixa

Os tipos de listas e união de XML não são totalmente suportados.

Os tipos de lista e união são totalmente suportados, inclusive as seguintes funcionalidades:

  • União de lista

  • União de união

  • Lista de tipos atômicos

  • Lista de união

Baixa

As opções SET requeridas para um método xQuery não são validadas quando o método é contido em uma exibição ou função com valor de tabela embutida.

As opções SET requeridas para um método xQuery são validadas quando o método é contido em uma exibição ou função com valor de tabela embutida. Um erro ocorrerá se as opções SET do método forem definidas incorretamente.

Para obter mais informações sobre as configurações da opção requerida, consulte Definindo opções (tipo de dados XML).

Baixa

Os valores do atributo XML que contém caracteres de final de linha (retorno de carro e alimentação de linha) não são normalizados de acordo com o padrão XML. Isto é, ambos os caracteres são retornados, em vez de um único caractere de alimentação de linha.

Os valores do atributo XML que contém caracteres de final de linha (retorno de carro e alimentação de linha) são normalizados de acordo com o padrão XML. Isto é, todas as quebras de linha em entidades externas de análise (incluindo a entidade do documento) são normalizadas na entrada pela tradução da seqüência de dois caracteres #xD #xA e de qualquer #xD que não seja seguido por #xA em um único caractere #xA.

Aplicativos que usam atributos para transportar valores da cadeia de caracteres que contêm caracteres de final de linha não receberão de volta estes caracteres, já que eles foram submetidos. Para evitar o processo de normalização, use as entidades de caractere numérico XML para codificar todos os caracteres de final de linha.

Baixa

As propriedades das colunas ROWGUIDCOL e IDENTITY podem ser nomeadas incorretamente como restrições. Por exemplo, a instrução CREATE TABLE T (C1 int CONSTRAINT MyConstraint IDENTITY) executa, mas o nome da restrição não é preservado e não fica acessível ao usuário.

As propriedades das colunas ROWGUIDCOL e IDENTITY não podem ser nomeadas como uma restrição. Retornam o erro 156.

Baixa

A atualização de colunas usando atribuição bidirecional, tal qual UPDATE T1 SET @v = column_name = <expression>, pode produzir resultados inesperados porque o valor de vida útil da variável pode ser usado em outras cláusulas, como nas cláusulas WHERE e ON, durante a execução de instruções, em vez do valor de início da instrução. Isto pode causar a alteração imprevisível dos significados dos predicados em uma base por linha.

Este comportamento só é aplicável quando o nível de compatibilidade é definido em 90.

A atualização de colunas usando uma atribuição bidirecional gera resultados esperados porque só o valor inicial da instrução é acessado durante a execução da instrução.

Baixa

A atribuição de variável é permitida em uma instrução que contém um operador UNION de nível superior, mas retorna resultados inesperados. Por exemplo, nas instruções a seguir, o valor da coluna EmployeeID da união de duas tabelas é atribuído ao @v da variável local. Por definição, quando a instrução SELECT retorna mais de um valor, a variável é atribuída ao último valor retornado. Neste caso, a variável é atribuída corretamente ao último valor, porém, o conjunto de resultados da instrução SELECT UNION também é retornado.

ALTER DATABASE AdventureWorks
SET compatibility_level = 90;
GO
USE AdventureWorks;
GO
DECLARE @v int;
SELECT @v = EmployeeID FROM HumanResources.Employee
UNION ALL
SELECT @v = EmployeeID FROM HumanResources.EmployeeAddress;
SELECT @v;

A atribuição da variável não é permitida em uma instrução que contenha um operador UNION de nível superior. O erro 10734 é retornado.

Para resolver o erro, reescreva a consulta como demonstrado no exemplo a seguir.

DECLARE @v int;
SELECT @v = EmployeeID FROM 
    (SELECT EmployeeID FROM HumanResources.Employee
     UNION ALL
     SELECT EmployeeID FROM HumanResources.EmployeeAddress) AS Test
SELECT @v;

Baixa

A função ODBC {fn CONVERT()} usa o formato de data padrão do idioma. Em algumas linguagens, o formato padrão é YDM, que pode resultar em erros de conversão quando CONVERT() é combinado com outras funções, como {fn CURDATE()}, que espera um formato YMD.

A função ODBC {fn CONVERT()} usa o estilo 121 (um formato YMD independente de linguagem) ao converter os tipos de dados ODBC SQL_TIMESTAMP, SQL_DATE, SQL_TIME, SQLDATE, SQL_TYPE_TIME e SQL_TYPE_TIMESTAMP.

Baixa

A função ODBC {fn CURDATE()} retorna somente a data no formato ‘AAAA-MM-DD’.

A função ODBC {fn CURDATE()} retorna a data e a hora, como, por exemplo, AAAA-MM-DD hh:mm:ss.

Baixa

Datetime intrínseco, como DATEPART, não exige que os valores de entrada de cadeia de caracteres sejam literais válidas de datetime. Por exemplo, SELECT DATEPART (ano, ‘2007/05-30') compila com sucesso.

Datetime intrínseco, como DATEPART, exige que os valores de entrada de cadeia de caracteres sejam literais válidas de datetime. Erro 241 é retornado quando um datetime literal inválido é usado.

Baixa

Palavras-chave reservadas

A configuração de compatibilidade também determina as palavras-chave que são reservadas pelo Mecanismo de Banco de Dados. A tabela a seguir mostra as palavras-chave reservadas que são introduzidas em cada nível de compatibilidade.

Configuração de nível de compatibilidade

Palavras-chave reservadas

100

CUBE, MERGE, ROLLUP

90

EXTERNAL, PIVOT, UNPIVOT, REVERT, TABLESAMPLE

80

COLLATE, FUNCTION, OPENXML

Em um determinado nível de compatibilidade, as palavras-chave reservadas incluem todas as palavras-chave introduzidas naquele nível ou abaixo dele. Por exemplo, para aplicativos no nível 100, todas as palavras-chave listadas na tabela anterior são reservadas. Nos níveis de compatibilidade inferiores, as palavras-chave de nível 100 permanecem nomes de objeto válidos, mas os recursos de idioma de nível 100 correspondentes a essas palavras-chave não estão disponíveis.

Uma vez introduzida, uma palavra-chave permanece reservada. Por exemplo, a palavra-chave reservada OPENXML, que foi introduzida no nível de compatibilidade 80, também é reservada nos níveis 90 e 100.

Se um aplicativo usar um identificador que é reservado como uma palavra-chave no seu nível de compatibilidade, o aplicativo falhará. Para solucionar esse problema, inclua o identificador entre colchetes ([]) ou aspas (""); por exemplo, para atualizar um aplicativo que usa o identificador EXTERNAL com o nível de compatibilidade 90, você pode alterar o identificador para [EXTERNAL] ou "EXTERNAL".

Para obter mais informações, consulte Palavras-chave reservadas (Transact-SQL).

Permissões

Requer a permissão ALTER no banco de dados.

Exemplos

A. Alterando o nível de compatibilidade

O exemplo a seguir altera o nível de compatibilidade do banco de dados AdventureWorks para 90,SQL Server 2005.

ALTER DATABASE AdventureWorks
SET COMPATIBILITY_LEVEL = 90;
GO

B. Efeito do nível de compatibilidade em ORDER BY (Cenário 1)

O exemplo a seguir ilustra a diferença na associação ORDER BY para os níveis de compatibilidade 80 e 100. O exemplo cria uma tabela de exemplo, SampleTable, no banco de dados tempdb.

USE tempdb;
CREATE TABLE SampleTable(c1 int, c2 int);
GO

Em níveis de compatibilidade 90 e superior, no nível padrão, a instrução SELECT... ORDER BY a seguir produz um erro porque o alias de coluna na cláusula AS, c1, é ambíguo.

SELECT c1, c2 AS c1
FROM SampleTable
ORDER BY c1;
GO

Depois de redefinir o banco de dados para o nível de compatibilidade 80, a mesma instrução SELECT... ORDER BY será bem-sucedida.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT c1, c2 AS c1
FROM SampleTable
ORDER BY c1;
GO

A seguinte instrução SELECT... ORDER BY funciona em ambos os níveis de compatibilidade porque um alias inequívoco é especificado na cláusula AS.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 100;
GO
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

C. Efeito do nível de compatibilidade em ORDER BY (Cenário 2)

Em níveis de compatibilidade 90 e superior, no nível padrão, a instrução SELECT...ORDER BY a seguir produz um erro porque o alias de coluna especificado na cláusula ORDER BY contém um prefixo de tabela.

SELECT c1 AS x
FROM SampleTable
ORDER BY SampleTable.x;
GO

Depois de redefinir o banco de dados para o nível de compatibilidade 80, a mesma instrução SELECT...ORDER BY será bem-sucedida.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT c1 AS x
FROM SampleTable
ORDER BY SampleTable.x;
GO

A seguinte instrução SELECT...ORDER BY funciona em ambos os níveis de compatibilidade porque o prefixo de tabela foi removido da coluna alias especificada na cláusula ORDER BY.

ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 100;
GO
SELECT c1 AS x
FROM SampleTable
ORDER BY x;
GO
ALTER DATABASE tempdb
SET COMPATIBILITY_LEVEL = 80;
GO
SELECT c1 AS x
FROM SampleTable
ORDER BY x;
GO

Histórico de alterações

Conteúdo atualizado

Corrigido o comportamento da instrução XACT_ABORT quando especificado dentro de um gatilho. Definir XACT_ABORT como OFF em um gatilho é ignorado no nível de compatibilidade 80 e permitido em 90 e no nível de compatibilidade mais alto. A documentação anterior reverteu essas informações.