"Tidak dapat menemukan prosedur tersimpan 'meskipun prosedur tersimpan telah dibuat di MS SQL Server Management Studio

21

Saya telah membuat tabel testtabledi dalam database testbaseyang memiliki struktur berikut:

product_no (int, not null)
product_name (varchar(30), not null)
price (money, null)
expire_date (date, null)
expire_time (time(7), null)

yang saya gunakan Microsoft SQL Server 2008 Management Studio.

Saya membuat prosedur tersimpan testtable_pricesmallersebagai berikut

use testbase
go
create procedure testtable_pricesmaller
    @pricelimit money
as
select * from testtable where price = @pricelimit;
go

dan dapat melihat Prosedur Tersimpan di Object Explorerdari Microsoft SQL Server Management Studio. (Terdaftar dalam struktur pohon berikut Object Explorer)

Databases
    + testbase
        + Tables
            + dbo.testtable
        + Programmability
            + Stored Procedures
                + dbo.testtable_pricesmaller

Saya merasa sangat aneh ketika saya menerima kesalahan berikut:

Could not find the stored procedure 'dbo.testtable_pricesmaller'.

ketika saya menjalankan pernyataan SQL berikut:

execute dbo.testtable_pricesmaller 50

Apa yang bisa hilang?

Mendongkrak
sumber
Apakah Anda memastikan pernyataan eksekusi Anda berjalan di bawah konteks basis data "testbase"? Anda dapat mencoba menambahkan pernyataan USE atau memenuhi syarat nama objek.
Shawn Melton
Ya, saya memang menambahkan USEpernyataan tetapi itu memberi saya kesalahan.
Jack
Saya harus secara eksplisit mendefinisikan nama database dalam pernyataan eksekusi saya: EXEC [testbase]. [Dbo]. [
Testtable_pricesmaller

Jawaban:

17

IntelliSense Segarkan Cache lokal harus memperbaikinya

pengguna63684
sumber
7

Anda tidak harus me-restart database setelah menambahkan prosedur tersimpan yang baru, meskipun Anda perlu me-refresh objek Anda explorer untuk melihatnya di sana.

Lain kali Anda menambahkan prosedur yang tersimpan coba jalankan opsi klik kanan eksekusi dari objek explorer dan masukkan parameter Anda dan lihat apakah itu berjalan. Jika tidak berjalan maka saya tidak yakin apa masalah Anda. Jika tidak berjalan maka itu bisa menjadi sesuatu yang sederhana seperti SQL sedang mencoba untuk query dari database yang salah.

Zane
sumber
4

Akhirnya saya tahu mengapa pesan itu muncul di MS SQL Server Management Studio.

MS SQL Server Management Studio memerlukannya untuk memulai kembali setelah membuat prosedur tersimpan di dalamnya.

Setelah memulai kembali MS SQL Server Management Studio, tidak ada kesalahan seperti itu lagi.

(Aneh, apakah itu berarti bahwa setiap kali saya membuat prosedur tersimpan, saya harus memulai ulang?)

Mendongkrak
sumber
12
Anda tidak harus me-restart itu.
Shawn Melton
1
@ ShawnMelton Maksud saya menutup MS SQL Server Management Studio dan membuka kembali MS SQL Server Management Studio. Saya hanya merasa aneh bahwa saya harus menutup dan kemudian membukanya kembali. Apakah ada konfigurasi MS SQL Server Management Studio (SSMS) yang mungkin saya lewatkan, sehingga SSMS tidak dapat mencerminkan bahwa Prosedur Tersimpan sudah dibuat?
Jack
5
IntelliSense adalah satu-satunya bagian yang tertinggal dari apa yang Anda lakukan. Mengeksekusi pernyataan exec seharusnya bekerja tanpa me-restart SSMS. Ada hal lain yang berkontribusi agar tidak berfungsi. Saya setuju dengan @ShawnMelton.
Thomas Stringer
@ Hiu, Menarik! Saya akan sangat menghargai jika ada yang bisa menjelaskan kepada saya bahwa mengapa SSMS saya berperilaku sedemikian rupa sehingga saya merasa sangat aneh.
Jack
6
Untuk referensi di masa mendatang: Ctrl-Shift-R akan menyegarkan cache lokal, untuk intellisense.
Adam Scharp
3

Perintah create Anda seharusnya

create procedure dbo.testtable_pricesmaller
    @pricelimit money

Anda hilang dbo.sebelum nama prosedur. Setiap kali Anda membuat prosedur, praktik yang baik untuk secara eksplisit menentukan pengguna / skema dengan nama prosedur yaitu nama prosedur harus memiliki tanda tangan yang memenuhi syarat.

Saya harap ini akan membantu Anda.

Saim Saboor
sumber
3

Dalam SQL Server 2008, ketika login di bawah akun Windows, jika Anda tidak memiliki tingkat keamanan SYSADMIN, ketika Anda membuat objek tanpa secara eksplisit menentukan skema, itu mungkin / akan membuatnya di bawah [DOMAIN \ nama pengguna]. [ObjectName ] bukan [dbo]. [ObjectName] (itu diperbaiki di SQL Server 2012 saya pikir).

Saya memiliki masalah ini terjadi pada saya ketika saya mengurangi tingkat keamanan pengguna, dan salah satu prosedur yang dia jalankan adalah menjatuhkan dan membuat ulang tabel tanpa skema, sehingga prosedur lainnya mogok karena tidak dapat mengakses objek lagi . Ternyata tabel itu sekarang dibuat dengan nama pengguna domainnya.

Berikut adalah pos Microsoft tentang perilaku ini:

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017 (lihat bagian "Skema Tersirat dan Penciptaan Pengguna")

Tabel tidak dibuat di bawah skema dbo

SQL 2008 R2 membuat pengguna / skema ketika pengguna Windows membuat tabel

Jadi, singkatnya, Anda mungkin memiliki masalah basis data (Anda membuat tabel dalam basis data tetapi mencoba mengaksesnya dari basis data lain) atau Anda memiliki masalah seperti yang baru saja saya jelaskan.

Philippe
sumber
2

Saya tahu ini sudah tua; Saya menemukan pertanyaan ini ketika saya sedang mencari solusi untuk masalah yang sama ini, dan saya memposting jawaban ini dengan harapan dapat membantu orang lain yang juga menemukan pertanyaan ini.

Dalam kasus saya, saya mendapat pesan kesalahan saat menjalankan laporan SSR menggunakan sumber data bersama. Sumber data bersama ini tidak menentukan database default (Katalog Default = parameter), dan saya tidak bisa menambahkannya ke string koneksi karena saya tidak memiliki kata sandi (dan ketika Anda mengubah sesuatu di sumber data SSRS cenderung ingin Anda memasukkan kembali kata sandi).

Untuk mengatasi ini, saya mengubah database default untuk login dalam contoh SQL Server dari master ke database yang berisi prosedur tersimpan yang ingin dieksekusi oleh laporan.

Saat menjalankan sesuatu dari SSMS, perlu diingat panel Object Explorer adalah satu koneksi sedangkan editor apa pun yang Anda miliki adalah koneksi yang sama sekali berbeda. Jadi Anda mungkin melihat objek untuk SQL01 di Object Explorer, tetapi kode yang Anda jalankan di editor akan berjalan terhadap SQL02 - Saya telah mengalami masalah ini beberapa kali selama bertahun-tahun dan setelah banyak memaki dan "Mengapa tidak akan ini bekerja? " menyadari kesalahan saya. Untuk editor, lihat di sudut kanan bawah untuk melihat instance dan database yang terhubung dengan Anda.

SM
sumber
1

TL; DR: Anda mungkin memiliki prosedur tersimpan yang memanggil prosedur tersimpan lain yang tidak ada.


Saya punya masalah ini dan menemukan perbaikan. Inilah yang terjadi. Saya membuat satu prosedur tersimpan:

create procedure dbo.MyProc
    ...

Saya kemudian membuat prosedur tersimpan lain yang menjalankan yang pertama

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc
    ...

Beberapa waktu kemudian, saya berganti nama dbo.MyProcmenjadi dbo.MyProc2. Setelah mengganti nama, ketika saya mencoba menelepon dbo.MyProcCaller, saya akan menerima pesan kesalahan ini:

exec dbo.MyProcCaller

Tidak dapat menemukan prosedur tersimpan 'RLM.usp_getSecondaryRestrictedLists_Old'.

Solusi saya adalah mengubah prosedur tersimpan kedua saya untuk menggunakan nama baru:

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc2
    ...

Berikut cara mudah untuk memeriksa apakah Anda memiliki masalah ini. Klik untuk memodifikasi teks dari prosedur tersimpan dan kemudian jalankan teks itu. Jika Anda mendapat peringatan seperti ini, Anda perlu mengganti nama prosedur tersimpan Anda:

Modul 'dbo.MyProcCaller' tergantung pada objek yang hilang 'dbo.MyProc'. Modul masih akan dibuat; Namun, itu tidak dapat berjalan dengan sukses sampai objek ada.

(1 baris terpengaruh)

pengguna2023861
sumber
0

Pertanyaan ini sudah berumur beberapa tahun, tetapi saya hanya ingin memberikan kemungkinan lain bagi orang seperti saya yang menemukannya nanti.

Saya menjalankan perintah ini: EXEC SP_CONFIGURE 'Agent XPs'

Dan kesalahan dijelaskan: Msg 2812, Level 16, State 62, Line 1 Tidak dapat menemukan prosedur tersimpan 'SP_CONFIGURE'.

Tetapi kemudian saya ingat bahwa server ini diatur untuk peka terhadap huruf besar-kecil. Jadi perintah ini bekerja dengan baik: EXEC sp_configure 'Agent XPs'

HTH

jrdevdba
sumber