Quantcast
Channel: MSDN Blogs
Viewing all articles
Browse latest Browse all 29128

[Troubleshooting] Diferenças de comportamento da opção 'QUOTE_IDENTIFIER'

$
0
0

Cenário:

Um de nossos clientes desejava executar uma procedure que manipulava informações no padrão XML. A instância SQL Server havia sido migrada para SQL Server 2008 R2 há pouco menos de uma semana.

Problema:

Foi reportado o seguinte erro, ao tentar executar uma procedure com processamento de informações XML:

SELECT failed because the following SET options have incorrect settings:
'QUOTE_IDENTIFIER'. Verify set options are correct for use indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data types methods and/or spatial index operations.

Informações adicionais:

Tal erro persistia mesmo com a opção SET QUOTED_IDENTIFIER  ON sendo definida na sessão.
A mensagem ocorre apenas quando o banco de dados está em Compatibility Level 100. Quando o banco de dados é reconfigurado para Compatibility Level 90 o SQL Server executa a procedure com sucesso.

Explicação:

Após alguns testes concluímos que a procedure havia sido criada com a opção SET QUOTED_IDENTIFIER OFF.
Tal conclusão se dá pelo fato de que o SQL Server 2008 utiliza a opção QUOTED_IDENTIFIER utilizada no momento da criação da stored procedure, ou seja, mesmo forçando o SET QUOTED_IDENTIFIER ON na sessão que está executando a procedure, o SQL Server 2008 ignora a opção da sessão e passa a utilizar apenas o que foi definido no momento da criação.
Já o SQL Server 2005, utiliza a opção da sessão que está executando a procedure, independente do que foi definido na criação do objeto. Como todas as sessões abertas contra o banco de dados, por padrão, são QUOTED_IDENTIFIER ON, forçando ou não a utilização desta opção, a procedure é executada com sucesso em bancos de dados com o Compatibility Level 90.
 

Recomendação:
Para resolução deste problema recomendamos o cliente a manter o banco de dados em Compatibility Level 100 e alterar a procedure incluindo a opção SET QUOTED_IDENTIFIER ON.
Dessa forma, o código de alteração da procedure ficaria da seguinte forma:

SET QUOTED_IDENTIFIER ON;

GO

ALTER PROCEDURE …

Referência:

SET QUOTED_IDENTIFIER (Transact-SQL)
http://msdn.microsoft.com/pt-br/library/ms174393.aspx


Differences Between Lower Compatibility Levels and Level 100
http://msdn.microsoft.com/en-us/library/bb510680.aspx


Viewing all articles
Browse latest Browse all 29128

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>