Ispirato da questa domanda in cui ci sono viste diverse su SET NOCOUNT ...
Dovremmo usare SET NOCOUNT ON per SQL Server? In caso contrario, perché no?
Cosa fa Modifica 6, il 22 lug 2011
Sopprime il messaggio "Righe xx interessate" dopo qualsiasi DML. Questo è un gruppo di risultati e quando viene inviato, il client deve elaborarlo. È piccolo, ma misurabile (vedi risposte sotto)
Per i trigger ecc., Il client riceverà più "righe xx interessate" e questo causerà tutti i tipi di errori per alcuni ORM, MS Access, JPA ecc. (Vedere le modifiche di seguito)
Sfondo:
Le best practice generalmente accettate (ho pensato fino a questa domanda) devono essere utilizzate SET NOCOUNT ON
nei trigger e nelle stored procedure in SQL Server. Lo usiamo ovunque e un rapido google mostra anche molti MVP di SQL Server d'accordo.
MSDN dice che questo può rompere un .net SQLDataAdapter .
Ora, questo significa per me che SQLDataAdapter è limitato all'elaborazione CRUD semplicemente perché si aspetta che il messaggio "n righe interessate" corrisponda. Quindi, non posso usare:
- SE ESISTE per evitare duplicati (nessun messaggio sulle righe interessate) Nota: utilizzare con cautela
- DOVE NON ESISTE (meno righe del previsto
- Filtra aggiornamenti banali (ad es. Nessun dato cambia effettivamente)
- Effettua qualsiasi accesso alla tabella prima (come la registrazione)
- Nascondi complessità o denormlizzazione
- eccetera
Nella domanda marc_s (che conosce le sue cose SQL) dice di non usarlo. Ciò differisce da quello che penso (e mi considero un po 'competente anche in SQL).
È possibile che mi manchi qualcosa (sentiti libero di sottolineare l'ovvio), ma cosa ne pensi là fuori?
Nota: sono passati anni da quando ho visto questo errore perché al giorno d'oggi non uso SQLDataAdapter.
Modifiche dopo commenti e domande:
Modifica: più pensieri ...
Abbiamo più client: uno può usare un SQLDataAdaptor C #, un altro può usare nHibernate da Java. Questi possono essere influenzati in diversi modi con SET NOCOUNT ON
.
Se consideri i proc memorizzati come metodi, allora è una cattiva forma (anti-pattern) supporre che l'elaborazione interna funzioni in un certo modo per i tuoi scopi.
Modifica 2: un trigger che interrompe la domanda nHibernate , dove SET NOCOUNT ON
non può essere impostato
(e no, non è un duplicato di questo )
Modifica 3: ancora più informazioni, grazie al mio collega MVP
- 240882 KB , problema che causa disconnessioni su SQL 2000 e precedenti
- Demo del guadagno in termini di prestazioni
Modifica 4: 13 maggio 2011
Rompe anche Linq 2 SQL quando non specificato?
Modifica 5: 14 giu 2011
Rompere JPA, proc memorizzato con variabili di tabella: JPA 2.0 supporta le variabili di tabella di SQL Server?
Modifica 6: 15 ago 2011
La griglia di dati "Modifica righe" di SSMS richiede SET NOCOUNT ON: Aggiorna trigger con GROUP BY
Modifica 7: 07 Mar 2013
Dettagli più dettagliati da @RemusRusanu:
SET NOCOUNT ON fa davvero molta differenza nelle prestazioni