Inspirado por esta pergunta, em que existem diferentes pontos de vista sobre SET NOCOUNT ...
Devemos usar SET NOCOUNT ON para SQL Server? Se não, por que não?
O que faz Edit 6, on 22 Jul 2011
Suprime a mensagem "xx linhas afetadas" após qualquer DML. Este é um conjunto de resultados e, quando enviado, o cliente deve processá-lo. É pequeno, mas mensurável (veja as respostas abaixo)
Para gatilhos, etc, o cliente receberá várias "linhas xx afetadas" e isso causa todos os tipos de erros para alguns ORMs, MS Access, JPA etc. (veja as edições abaixo)
Fundo:
A melhor prática geral aceita (pensei até essa pergunta) é usar SET NOCOUNT ON
gatilhos e procedimentos armazenados no SQL Server. Nós o usamos em qualquer lugar e um rápido google mostra muitos MVPs do SQL Server também.
MSDN diz que isso pode quebrar um .net SQLDataAdapter .
Agora, isso significa para mim que o SQLDataAdapter está limitado ao processamento de CRUD simplesmente porque espera que a mensagem "n linhas afetadas" corresponda. Então, eu não posso usar:
- SE EXISTE para evitar duplicatas (nenhuma linha afetou a mensagem) Nota: use com cuidado
- ONDE NÃO EXISTE (menos linhas do que o esperado
- Filtrar atualizações triviais (por exemplo, nenhum dado realmente muda)
- Faça qualquer acesso à tabela antes (como o log)
- Ocultar complexidade ou denormlisation
- etc
Na pergunta marc_s (quem conhece o seu material SQL) diz que não o usa. Isso difere do que penso (e também me considero um pouco competente em SQL).
É possível que eu esteja perdendo alguma coisa (sinta-se à vontade para apontar o óbvio), mas o que vocês acham?
Nota: já faz anos que não vejo esse erro porque não uso o SQLDataAdapter atualmente.
Edita após comentários e perguntas:
Edit: Mais pensamentos ...
Temos vários clientes: um pode usar um C # SQLDataAdaptor, outro pode usar o nHibernate do Java. Estes podem ser afetados de diferentes maneiras com SET NOCOUNT ON
.
Se você considerar procs armazenados como métodos, é uma má forma (antipadrão) supor que algum processamento interno funcione de certa maneira para seus próprios propósitos.
Edit 2: uma questão nHibernate de trigger trigger , onde SET NOCOUNT ON
não pode ser definida
(e não, não é uma duplicata disso )
Edit 3: Mais informações, graças ao meu colega MVP
- KB 240882 , problema que causa desconexões no SQL 2000 e versões anteriores
- Demonstração de ganho de desempenho
Edit 4: 13 de maio de 2011
Quebra Linq 2 SQL também quando não especificado?
Edit 5: 14 Jun 2011
Quebra JPA, processo armazenado com variáveis de tabela: O JPA 2.0 suporta variáveis de tabela do SQL Server?
Edit 6: 15 de agosto de 2011
A grade de dados "Editar linhas" do SSMS requer SET NOCOUNT ON: atualize o gatilho com GROUP BY
Edit 7: 07 Mar 2013
Detalhes mais detalhados do @RemusRusanu:
O SET NOCOUNT ON realmente faz muita diferença de desempenho