Gejala
Ketika menggunakan fungsi SCOPE_IDENTITY() atau @@IDENTITYuntuk mengambil nilai yang disisipkan ke dalam kolom identitas, Anda mungkin melihat bahwa fungsi-fungsi ini terkadang mengembalikan nilai yang salah. Masalah ini terjadi hanya saat kueri Anda menggunakan rencana eksekusi paralel. Untuk informasi selengkapnya tentang cara menentukan apakah kueri Anda akan menggunakan rencana eksekusi paralel merujuk pada bagian paralel antar kueri di artikel teknis berikut pada Unduhan Microsoft:
Penyebab
Microsoft telah mengonfirmasi bahwa hal ini merupakan masalah dalam produk Microsoft yang tercantum di bagian awal artikel ini.
Pemecahan Masalah
Informasi pembaruan kumulatif
SQL Server 2008 R2 Service Pack 1
Perbaikan untuk masalah ini pertama kali dirilis dalam Pembaruan Kumulatif 5 untuk SQL Server 2008 R2 Paket Layanan 1. Untuk informasi selengkapnya tentang cara mendapatkan paket pembaruan kumulatif ini, klik nomor artikel berikut untuk melihat artikel dalam Pangkalan Pengetahuan Microsoft:
2659694Paket Pembaruan Kumulatif 5 untuk SQL Server 2008 R2 Paket Layanan 1
Catatan Karena build bersifat kumulatif, setiap rilis perbaikan baru berisi hotfix dan semua perbaikan keamanan yang disertakan dengan rilis perbaikan sebelumnya SQL Server 2008 R2. Kami menyarankan Anda untuk mempertimbangkan menerapkan rilis perbaikan terbaru yang berisi hotfix ini. Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
2567616Build SQL Server 2008 R2 yang dirilis setelah SQL Server 2008 R2 Service Pack 1 dirilis
Penyelesaian Masalah
Microsoft menyarankan agar Anda tidak menggunakan salah satu fungsi ini di kueri ketika rencana paralel dilibatkan karena tidak selalu dapat diandalkan. Sebagai gantinya, gunakan klausul OUTPUT pernyataan INSERT untuk mengambil nilai identitas seperti yang diperlihatkan dalam contoh di bawah ini.
Contoh penggunaan klausul OUTPUT:
DECLARE @MyNewIdentityValues table(myidvalues int)
deklarasi @A tabel (ID kunci primer int)
sisipkan ke @A bidang (1)
deklarasi @B tabel (ID int identitas kunci utama(1,1), B int not null)
sisipkan ke @B bidang (1)
pilih
[RowCount] = @@RowCount,
[@@IDENTITY] = @@IDENTITY,
[SCOPE_IDENTITY] = SCOPE_IDENTITY()
setel profil statistik pada
sisipkan ke _ddr_T
output inserted.ID ke @MyNewIdentityValues
pilih
b.ID
dari @A
kiri bergabung @B b pada b.ID = 1
kiri bergabung @B b2 pada b2. B = -1
kiri _ddr_T t pada t.T = -1
di mana tidak ada (pilih * _ddr_T t2 di mana t2.ID = -1)
menonaktifkan profil statistik
pilih
[RowCount] = @@RowCount,
[@@IDENTITY] = @@IDENTITY,
[SCOPE_IDENTITY] = SCOPE_IDENTITY(),
[IDENT_CURRENT] = IDENT_CURRENT('_ddr_T')
pilih * dari @MyNewIdentityValues
mulai
Jika situasi Anda mengharuskan Anda untuk menggunakan salah satu fungsi ini, Anda dapat menggunakan salah satu metode berikut ini untuk mengatasi masalah tersebut.
Metode 1:
Sertakan opsi berikut ini dalam kueri Anda
OPTION (MAXDOP 1)
Catatan: Hal ini mungkin merusak kinerja bagian SELECT dari kueri Anda.
Metode 2:
Baca nilai dari bagian SELECT ke dalam kumpulan variabel (atau variabel tabel tunggal) lalu sisipkan ke dalam tabel target dengan MAXDOP=1. Karena rencana INSERT tidak akan paralel, Anda akan mendapatkan semantik yang tepat, tetapi SELECT akan menjadi paralel untuk mencapai kinerja yang diinginkan.
Metode 3:
Jalankan pernyataan berikut untuk mengatur opsi derajat paralel maksimum ke 1:
sp_configure 'derajat paralel maksimum', 1
mulai
mengonfigurasi ulang dengan mengesampingkan
mulai
Catatan: Metode ini dapat menyebabkan degradasi kinerja di server. Anda tidak boleh menggunakan metode ini kecuali jika Anda telah mengevaluasinya dalam pengujian, atau perekanan, lingkungan.
Informasi Selengkapnya
Bug Microsoft Connect pada masalahhttps://docs.microsoft.com/en-us/collaborate/connect-redirect