Prosedur Tersimpan yang mengembalikan hasil duplikat sedangkan saat mengaktifkan sql, prosedur tersebut dijalankan secara langsung tidak

Kami memiliki prosedur tersimpan di SQL Server 2005 dengan sedikit kueri pemilihan tunggal yang rumit. Baru-baru ini di satu lingkungan, kami memperhatikan bahwa untuk sebagian kecil hasil yang dikembalikan oleh proc yang disimpan, terdapat catatan duplikat. Saat kami menjalankan kueri sql secara langsung, kami mendapatkan kumpulan catatan yang benar tanpa duplikat. Prosedur tersimpan menggunakan banyak tampilan dan gabungan (gabungan dalam/gabungan kiri). Salah satu teori yang saya miliki adalah bahwa prosedur tersimpan menggunakan beberapa rencana eksekusi yang di-cache karena kami telah memodifikasi beberapa tampilan baru-baru ini, tetapi saya tidak memiliki cukup keahlian SQL untuk memastikannya. Apakah ada yang tahu?

Terima kasih atas bantuanmu, Ashish


person Ashish    schedule 05.08.2011    source sumber
comment
Anda perlu memberikan informasi lebih lanjut. Apakah ada konfigurasi tingkat isolasi di proc? Bisakah Anda memposting beberapa kode contoh?   -  person JNK    schedule 05.08.2011
comment
Menurut saya, Anda salah mengira bahwa itu adalah rencana eksekusi yang di-cache. Anda harus memposting SQL sebanyak mungkin di dalam pertanyaan Anda dan membiarkan orang memeriksanya.   -  person Al W    schedule 05.08.2011
comment
Anda yakin menggunakan tipe parameter yang sama persis saat menjalankan kueri secara langsung? Apakah Anda mendeklarasikan variabel dengan tipe yang sama dengan parameter sp dan menggunakannya saat menjalankan secara langsung atau hanya nilai hardcoding?   -  person alun    schedule 05.08.2011
comment
Saya belum pernah melihat apa yang Anda bicarakan. Seringkali jawaban yang paling sederhana adalah jawaban yang benar. Apakah data Anda berubah antara eksekusi pertama dan kedua? Mungkin Anda memiliki operasi yang menambahkan catatan, kueri Anda dieksekusi dan kemudian baris yang menyebabkan duplikat dihapus.   -  person Paul Mendoza    schedule 06.08.2011


Jawaban (2)


Hasil yang berbeda mungkin disebabkan oleh pengaturan koneksi yang berbeda (misalnya ansi_nulls, arith_abort, dll.).

person MaD    schedule 27.08.2011

Jalankan sp_recompile pada prosedur tersimpan untuk menghapus cache prosedur untuk prosedur tersimpan tersebut.

Untuk menghapus seluruh prosedur, jalankan cache

PROCCACHE GRATIS DBCC

Berikut ini contoh kompilasi ulang jika Anda ingin memasukkannya ke dalam skrip yang dapat digunakan kembali:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** Object:  Maintenance - StoredProcedure [Sample].[SampleSearch]    Script Date: 07/28/2011 14:15:15 ******/
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'Sample' AND ROUTINE_NAME = 'Sampleearch'))
BEGIN
    PRINT 'Marking procedure [Sample].[SampleSearch] for recompile'
    EXEC sp_recompile 'Sample.SampleSearch'
    PRINT 'Finished marking procedure [Sample].[SampleSearch] for recompile'
END

GO

Namun, jika kueri memberikan hasil yang berbeda, mungkin aktifkan pelacakan SQL atau debug panggilan dari kode untuk memastikan parameter masuk dan keluar yang sama digunakan dalam kedua kasus.

person Jon Raynor    schedule 05.08.2011