Terinspirasi oleh pertanyaan ini di mana terdapat perbedaan pandangan tentang SET NOCOUNT ...
Haruskah kita menggunakan SET NOCOUNT ON untuk SQL Server? Jika tidak, mengapa tidak?
Apa yang dilakukannya Edit 6, pada 22 Jul 2011
Itu menekan pesan "xx baris yang terpengaruh" setelah DML apa pun. Ini adalah resultset dan ketika dikirim, klien harus memprosesnya. Ini kecil, tetapi dapat diukur (lihat jawaban di bawah)
Untuk pemicu dll, klien akan menerima beberapa "xx baris yang terpengaruh" dan ini menyebabkan semua jenis kesalahan untuk beberapa ORM, MS Access, JPA dll (lihat suntingan di bawah)
Latar Belakang:
Praktik terbaik yang diterima umum (saya pikir sampai pertanyaan ini) adalah untuk digunakan SET NOCOUNT ON
dalam pemicu dan prosedur tersimpan dalam SQL Server. Kami menggunakannya di mana-mana dan google cepat menunjukkan banyak MVP SQL Server yang menyetujui juga.
MSDN mengatakan ini dapat merusak .net SQLDataAdapter .
Sekarang, ini berarti bagi saya bahwa SQLDataAdapter terbatas hanya untuk pemrosesan CRUD karena mengharapkan pesan "n rows terpengaruh" agar cocok. Jadi, saya tidak bisa menggunakan:
- JIKA ADA untuk menghindari duplikat (tidak ada baris yang terpengaruh pesan) Catatan: gunakan dengan hati-hati
- DIMANA TIDAK ADA (lebih sedikit baris dari yang diharapkan
- Saring pembaruan sepele (mis. Tidak ada data yang benar-benar berubah)
- Lakukan akses tabel apa pun sebelumnya (seperti logging)
- Sembunyikan kompleksitas atau denormalisasi
- dll
Dalam pertanyaan, marc_s (siapa yang tahu hal-hal SQL-nya) mengatakan jangan menggunakannya. Ini berbeda dengan apa yang saya pikirkan (dan saya menganggap diri saya agak kompeten di SQL juga).
Mungkin saja saya kehilangan sesuatu (merasa bebas untuk menunjukkan yang sudah jelas), tetapi apa yang kalian pikirkan di luar sana?
Catatan: sudah bertahun-tahun sejak saya melihat kesalahan ini karena saya tidak menggunakan SQLDataAdapter saat ini.
Suntingan setelah komentar dan pertanyaan:
Edit: Lebih banyak pemikiran ...
Kami memiliki banyak klien: satu dapat menggunakan C # SQLDataAdaptor, yang lain dapat menggunakan nHibernate dari Java. Ini dapat dipengaruhi dengan berbagai cara dengan SET NOCOUNT ON
.
Jika Anda menganggap procs yang disimpan sebagai metode, maka itu bentuk yang buruk (anti-pola) untuk menganggap beberapa proses internal bekerja dengan cara tertentu untuk tujuan Anda sendiri.
Sunting 2: pemicu yang memecahkan pertanyaan nHibernate , di mana SET NOCOUNT ON
tidak dapat diatur
(dan tidak, ini bukan duplikat dari ini )
Sunting 3: Namun lebih banyak info, terima kasih kepada kolega MVP saya
- KB 240882 , masalah yang menyebabkan terputusnya SQL 2000 dan sebelumnya
- Demo perolehan kinerja
Sunting 4: 13 Mei 2011
Istirahat Linq 2 SQL juga ketika tidak ditentukan?
Sunting 5: 14 Juni 2011
Mematahkan JPA, proc yang disimpan dengan variabel tabel: Apakah JPA 2.0 mendukung variabel tabel SQL Server?
Sunting 6: 15 Agustus 2011
Kisi data "Edit rows" SSMS memerlukan SET NOCOUNT ON: Perbarui trigger dengan GROUP BY
Sunting 7: 07 Mar 2013
Lebih detail dari @RemusRusanu:
Apakah SET NOCOUNT ON benar-benar membuat banyak perbedaan kinerja