"Saklı yordam bulunamadı", saklı yordam MS SQL Server Management Studio'da oluşturulmuş olsa bile


21

Aşağıdaki yapıya sahip testtableveritabanında bir tablo oluşturdum testbase:

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

ki Microsoft SQL Server 2008 Management Studio'yu kullandım.

testtable_pricesmallerAşağıdaki gibi saklı bir prosedür oluşturdum

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

Object ExplorerMicrosoft SQL Server Management Studio'daki Kayıtlı İşlemleri görüntüleyebilir . (Aşağıdaki ağaç yapısında listelenmiştir Object Explorer)

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

Aşağıdaki hatayı aldığımda çok garip buluyorum:

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

aşağıdaki SQL deyimini çalıştırdığımda:

execute dbo.testtable_pricesmaller 50

Ne eksik olabilir?


Execute ifadenizin "testbase" veritabanı bağlamında çalıştığından emin misiniz? Bir USE deyimi eklemeyi veya nesne adını tam olarak nitelemeyi deneyebilirsiniz.
Shawn Melton

Evet, USEifadeyi ekledim ama bu bana hatayı verdi.
Jack,

EXEC [testbase]. [Dbo]. [Testtable_pricesmaller] 50
Jroonk 14:15

Yanıtlar:



7

Yeni bir saklı yordam ekledikten sonra veritabanını yeniden başlatmanız gerekmez, ancak orada görmek için nesne gezgininizi yenilemeniz gerekir.

Bir dahaki sefere saklı bir prosedür eklediğinizde, nesne gezgininden sağ tıkla çalıştır seçeneğini çalıştırmayı deneyin ve parametrelerinizi girin ve çalışıp çalışmadığını görün. Eğer işe yaramazsa, o zaman sorunun ne olduğundan emin değilim. Eğer çalışırsa, SQL yanlış veritabanından sorgulamaya çalışıyor gibi basit bir şey olabilir.


4

Sonunda mesajın neden MS SQL Server Management Studio'da göründüğünü biliyorum.

MS SQL Server Management Studio, içinde saklı bir prosedür oluşturduktan sonra onu yeniden başlatmayı gerektirir.

MS SQL Server Management Studio'yu yeniden başlattıktan sonra, artık böyle bir hata yok.

(Garip, bu her saklı yordam oluşturduğumda yeniden başlatmam gerektiği anlamına mı geliyor?)


12
Yeniden başlatmak zorunda değilsin.
Shawn Melton

1
@ShawnMelton Ben MS SQL Server Management Studio'yu kapatıyorum ve MS SQL Server Management Studio'yu tekrar açıyorum. Kapatmam ve sonra tekrar açmamın çok garip olduğunu düşünüyorum. MS SQL Server Management Studio'da (SSMS), SSMS'nin Kayıtlı Prosedürün zaten yaratıldığını yansıtamayacağı sonucu ortaya çıkarabilecek herhangi bir konfigürasyonu var mı?
Jack,

5
IntelliSense, yaptığınız şeyin yalnızca geciken kısmıdır. Exec ifadesini çalıştırmak, SSMS'yi yeniden başlatmadan çalışmalıydı. Çalışmamaya katkıda bulunan başka bir şey var. @ShawnMelton ile aynı fikirdeyim.
Thomas Stringer

@Shark, İlginç! Biri bana SSMS'imin neden oldukça garip bulacağı şekilde davrandığını açıklayabilirse sevinirim.
Jack

6
Gelecekte başvurmak için: Ctrl-Shift-R intellisense için yerel önbelleği yenileyecektir.
Adam Scharp

3

Create komutunuz olmalıdır

create procedure dbo.testtable_pricesmaller
    @pricelimit money

dbo.işlem adından önce eksik . Bir prosedür oluşturduğunuzda, kullanıcıyı / şemayı bir prosedür adıyla açıkça tanımlamak iyi bir uygulamadır, yani prosedür adı tam olarak imzalanmış olmalıdır.

Umarım bu sana yardımcı olmuştur.


3

SQL Server 2008'de, bir Windows hesabıyla giriş yaptığınızda, SYSADMIN güvenlik seviyeniz yoksa, şemayı açıkça belirtmeden bir nesne oluşturduğunuzda, [DOMAIN \ kullaniciadi] altında oluşturabilir. ] [dbo]. [ObjectName] yerine (sanırım SQL Server 2012'de düzeltildi).

Bir kullanıcının güvenlik seviyesini düşürdüğümde başıma bu sorun gelmişti ve yürütmekte olduğu prosedürlerden biri tabloları şema olmadan bırakıp yeniden yaratıyordu, bu yüzden prosedürün geri kalanı nesneye tekrar erişemediğinden çöküyordu. . Tabloların şimdi etki alanı kullanıcı adı altında oluşturulduğu ortaya çıktı.

İşte bu davranışla ilgili Microsoft gönderisi:

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017 ("Örtük Şema ve Kullanıcı Oluşturma" bölümüne bakın)

Tablo dbo şeması altında oluşturulmuyor

SQL 2008, Windows kullanıcısı tablo oluştururken kullanıcı / şema yaratıyor

Yani, kısacası, muhtemelen ya bir veritabanı probleminiz var (masanızı bir veritabanında yaratıyorsunuz fakat başka birinden erişiyorsunuz) ya da daha önce tanımladığım gibi bir probleminiz var.


2

Bunun eski olduğunu biliyorum; Aynı soruna bir çözüm ararken bu soruyla karşılaştım ve bu cevabı da bu soruyu başkalarının bulmasına yardımcı olacak umuduyla gönderiyorum.

Benim durumumda, paylaşılan veri kaynağını kullanarak bir SSRS raporu çalıştırırken hata mesajını aldım. Bu paylaşılan veri kaynağı varsayılan bir veritabanı belirtmedi (Varsayılan Katalog = parametre) ve parolaya sahip olmadığım için bağlantı dizgisine ekleyemedim (ve bir SSRS veri kaynağında bir şeyi değiştirdiğinizde şifreyi tekrar girmenizi istemek için).

Bunu çözmek için, SQL Server örneğindeki oturum açma için varsayılan veritabanını master'dan raporun yürütmek istediği saklı yordamı içeren veritabanına değiştirdim.

Bir şeyleri SSMS'den çalıştırırken, sahip olduğunuz editör tamamen farklı bir bağlantı olsa da Nesne Gezgini bölmesinin bir bağlantı olduğunu unutmayın. Böylece, Nesneler Gezgini'nde SQL01 için nesneler görebilirsiniz, ancak bir düzenleyicide çalıştırdığınız kod SQL02'ye karşı çalıştırılacak - Bu soruna yıllar içinde birkaç kez ve çok fazla küfretmeden sonra ve "Neden olmaz işe yarıyor mu? hatamı fark ettim. Editör için, hangi örnek ve veritabanına bağlandığınızı görmek için sağ alt köşeye bakın.


1

TL; DR: Var olmayan başka bir saklı yordam çağıran saklı yordam olabilir.


Bu sorunu yaşadım ve bir düzeltme buldum. İşte olanlar. Bir tane saklı yordam yarattım:

create procedure dbo.MyProc
    ...

Daha sonra ilkini uygulayan başka bir saklı yordam oluşturdum

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

Bir süre sonra adını dbo.MyProcdeğiştirdim dbo.MyProc2. Yeniden adlandırdıktan sonra aramaya çalıştığımda dbo.MyProcCallerşu hata mesajını alırdım:

exec dbo.MyProcCaller

'RLM.usp_getSecondaryRestrictedLists_Old' saklı yordamı bulunamadı.

Benim çözümüm yeni adımı kullanmak için ikinci saklı yordamımı değiştirmekti:

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

İşte bu sorunun olup olmadığını kontrol etmenin basit bir yolu. Saklı yordamın metnini değiştirmek için tıklatın ve sonra bu metni yürütün. Böyle bir uyarı alırsanız, saklı yordamınızı yeniden adlandırmanız gerekir:

'Dbo.MyProcCaller' modülü eksik 'dbo.MyProc' nesnesine bağlıdır. Modül hala oluşturulacak; ancak, nesne varana kadar başarıyla çalıştırılamaz.

(1 satır etkilendi)


0

Bu soru birkaç yaşında, ama sadece benim gibi birisini daha sonra bulan kişi için başka bir ihtimal atmak istiyorum.

Bu komutu koştum: EXEC SP_CONFIGURE 'Agent XP'ler'

Ve açıklanan hatayı aldım: Msj 2812, Seviye 16, Durum 62, Satır 1 'SP_CONFIGURE' saklı işlemi bulunamadı.

Ama sonra bu sunucunun büyük / küçük harfe duyarlı olarak ayarlandığını hatırladım. Yani bu komut gayet iyi çalıştı: EXEC sp_configure 'Agent XP'ler'

HTH

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.