SET NOCOUNT Erro no tratamento da chamada SQL após a atualização


13

Estamos atualizando nosso ambiente de teste com um novo servidor e uma versão atualizada do Microsoft SQL Server e encontramos um problema.

No novo servidor, nosso código antigo receberá "operação não permitida quando o objeto é fechado" ao executar alguns procedimentos armazenados. Esta mensagem nunca apareceu no servidor antigo. Quando o rastreamos, o problema pode ser resolvido adicionando- SET NOCOUNT ON;se ao procedimento armazenado.

Analisei os padrões no banco de dados e não vi configurações diferentes (SQL Server 2008 vs SQL Server 2014) relacionadas a padrões.

Que configuração devo procurar para resolver isso globalmente sem a necessidade de adicionar SET NOCOUNT ONa mil procs armazenados?


2
Todos os procedimentos armazenados devem especificar o comportamento em que você confia, o que é muito mais seguro do que depender das opções do usuário. Eu diria potencialmente que todo procedimento armazenado deve sempre começar com SET NOCOUNT ON;, sempre.
Aaron Bertrand

@AaronBertrand Concordo; o último projeto que eu estava em teve um modelo que tinha nocount set, mas isso não é uma opção neste projeto neste momento
UnhandledExcepSean

Observe que você pode escrever um script para alterar todos os procedimentos armazenados e acrescentar SET NOCOUNT ON;no início do procedimento armazenado (depois BEGIN). O número de procedimentos armazenados não deve ser realmente um problema.
Erik A

1
@ Erik-A - você não pode ter certeza de que um procedimento armazenado começa BEGIN- é legal, mas não obrigatório.
Max Vernon

Respostas:


16

A Configuração do SQL Server tem uma opção chamada, apropriadamente user options, que pode ser definida usando o sp_configureprocedimento armazenado do sistema. Eu escrevi uma postagem no blog do SQL Server Science mostrando como inspecionar e definir as opções do usuário.

Em resumo, você pode obter o "valor da configuração" do servidor antigo, usando o seguinte:

EXEC sys.sp_configure 'user options';

Em seguida, defina o novo servidor para usar as mesmas opções através deste:

EXEC sys.sp_configure 'user options', <config value>;
RECONFIGURE

(substitua o <valor da configuração> pelo valor do servidor antigo).


Essa é quase certamente a causa (aguardando confirmação agora). O servidor antigo tinha um valor 512, que é NOCOUNT, de acordo com o MS ( docs.microsoft.com/en-us/sql/database-engine/configure-windows/… ). Eu não vi isso antes, pois estava olhando apenas para @@ OPTIONS
UnhandledExcepSean

Definitivamente, isso está correto. Se SET NOCOUNT ONresolver o problema, definir as opções do usuário para 512 o corrigirá.
Max Vernon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.