"Konnte gespeicherte Prozedur nicht finden", obwohl die gespeicherte Prozedur in MS SQL Server Management Studio erstellt wurde

21

Ich habe eine Tabelle testtablein der Datenbank erstellt testbase, die die folgende Struktur aufweist:

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

mit dem ich das Microsoft SQL Server 2008 Management Studio verwendet habe.

Ich habe eine gespeicherte Prozedur testtable_pricesmallerwie folgt erstellt

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

und können die gespeicherten Prozeduren Object Explorerim Microsoft SQL Server Management Studio anzeigen . (Es ist in der folgenden Baumstruktur der aufgeführt Object Explorer)

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

Ich finde es sehr seltsam, wenn ich die folgende Fehlermeldung erhalte:

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

wenn ich die folgende SQL-Anweisung ausführe:

execute dbo.testtable_pricesmaller 50

Was könnte es fehlen?

Jack
quelle
Haben Sie sichergestellt, dass Ihre Execute-Anweisung im Kontext der Datenbank "testbase" ausgeführt wird? Sie können versuchen, eine USE-Anweisung hinzuzufügen oder den Objektnamen vollständig zu qualifizieren.
Shawn Melton
Ja, ich habe die USEAnweisung hinzugefügt , aber es gibt mir den Fehler.
Jack
Ich musste den Datenbanknamen in meiner Execute-Anweisung explizit definieren: EXEC [testbase]. [Dbo]. [Testtable_pricesmaller] 50
Jroonk

Antworten:

16

IntelliSense Refresh local Cache sollte das Problem beheben

user63684
quelle
7

Sie sollten die Datenbank nicht neu starten müssen, nachdem Sie eine neue gespeicherte Prozedur hinzugefügt haben, obwohl Sie Ihren Objekt-Explorer aktualisieren müssen, um sie dort anzuzeigen.

Wenn Sie das nächste Mal eine gespeicherte Prozedur hinzufügen, versuchen Sie, im Objekt-Explorer die Option Ausführen mit der rechten Maustaste auszuführen, geben Sie Ihre Parameter ein und prüfen Sie, ob sie ausgeführt wird. Wenn es nicht läuft, bin ich mir nicht sicher, was dein Problem ist. Wenn es ausgeführt wird, ist es möglicherweise so einfach, dass SQL versucht, eine Abfrage aus der falschen Datenbank durchzuführen.

Zane
quelle
4

Endlich weiß ich, warum die Meldung im MS SQL Server Management Studio erscheint.

MS SQL Server Management Studio erfordert einen Neustart, nachdem eine gespeicherte Prozedur erstellt wurde.

Nach dem Neustart von MS SQL Server Management Studio liegt kein solcher Fehler mehr vor.

(Merkwürdig, bedeutet das, dass ich eine gespeicherte Prozedur jedes Mal neu starten muss, wenn ich sie erstelle?)

Jack
quelle
12
Sie sollten es nicht neu starten müssen.
Shawn Melton
1
@ShawnMelton Ich meine, dass ich das MS SQL Server Management Studio schließe und das MS SQL Server Management Studio erneut öffne. Ich finde es nur ziemlich seltsam, dass ich es schließen und dann wieder öffnen muss. Enthält das MS SQL Server Management Studio (SSMS) eine Konfiguration, die möglicherweise nicht vorhanden ist und dazu führt, dass das SSMS nicht erkennen kann, dass die gespeicherte Prozedur bereits erstellt wurde?
Jack
5
IntelliSense ist der einzige Teil dessen, was Sie getan haben. Das Ausführen der exec-Anweisung hätte ohne Neustart von SSMS funktionieren müssen. Es gibt noch etwas, das dazu beigetragen hat, dass es nicht funktioniert. Ich bin mit @ShawnMelton einverstanden.
Thomas Stringer
@Shark, interessant! Ich würde mich freuen, wenn mir jemand erklären könnte, warum sich mein SSMS so verhält, dass ich es ziemlich seltsam finde.
Jack
6
Zum späteren Nachschlagen: Strg-Umschalt-R aktualisiert den lokalen Cache für Intellisense.
Adam Scharp
3

Ihr Befehl create sollte lauten

create procedure dbo.testtable_pricesmaller
    @pricelimit money

Sie fehlen dbo.vor dem Prozedurnamen. Wenn Sie eine Prozedur erstellen, empfiehlt es sich, den Benutzer / das Schema explizit mit dem Namen einer Prozedur zu definieren, dh der Prozedurname sollte vollqualifizierte Signaturen haben.

Ich hoffe, dies wird dir helfen.

Saim Saboor
quelle
3

Wenn Sie in SQL Server 2008 unter einem Windows-Konto angemeldet sind und keine SYSADMIN-Sicherheitsstufe haben, kann / wird beim Erstellen eines Objekts ohne explizite Angabe des Schemas dieses unter [DOMÄNE \ Benutzername] erstellt ] anstelle von [dbo]. [ObjectName] (es wurde in SQL Server 2012 behoben, denke ich).

Ich hatte dieses Problem, als ich die Sicherheitsstufe eines Benutzers herabgesetzt habe und eine der von ihm ausgeführten Prozeduren das Löschen und Neuerstellen von Tabellen ohne Schema war, sodass der Rest der Prozedur abstürzte, weil er nicht mehr auf das Objekt zugreifen konnte . Es stellte sich heraus, dass die Tabellen nun unter seinem Domain-Benutzernamen erstellt wurden.

Hier ist der Microsoft-Beitrag zu diesem Verhalten:

https://docs.microsoft.com/de-de/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017 (siehe Abschnitt "Implizites Schema und Benutzererstellung")

Tabelle wird im Dbo-Schema nicht erstellt

SQL 2008 R2 erstellt Benutzer / Schema, wenn Windows-Benutzer Tabellen erstellt

Kurz gesagt, Sie haben wahrscheinlich entweder ein Datenbankproblem (Sie erstellen Ihre Tabelle in einer Datenbank, versuchen aber, von einer anderen aus darauf zuzugreifen) oder Sie haben das eben beschriebene Problem.

Philippe
quelle
2

Ich weiß, dass das alt ist; Ich bin auf diese Frage gestoßen, als ich nach einer Lösung für dasselbe Problem gesucht habe, und ich poste diese Antwort in der Hoffnung, dass sie anderen hilft, die diese Frage ebenfalls finden.

In meinem Fall wurde die Fehlermeldung beim Ausführen eines SSRS-Berichts unter Verwendung einer freigegebenen Datenquelle angezeigt. Diese freigegebene Datenquelle hat keine Standarddatenbank angegeben (der Parameter Default Catalog =), und ich konnte sie nicht zur Verbindungszeichenfolge hinzufügen, weil ich kein Kennwort habe (und wenn Sie etwas in einer SSRS-Datenquelle ändern, besteht die Tendenz dazu damit Sie das Passwort erneut eingeben müssen).

Um dies zu lösen, habe ich die Standarddatenbank für die Anmeldung in der SQL Server-Instanz von master in die Datenbank geändert, die die gespeicherte Prozedur enthält, die der Bericht ausführen wollte.

Denken Sie beim Ausführen von Dingen über SSMS daran, dass der Bereich Objekt-Explorer eine Verbindung ist, während der von Ihnen verwendete Editor eine völlig andere Verbindung ist. Vielleicht sehen Sie die Objekte für SQL01 im Objekt-Explorer, aber der Code, den Sie in einem Editor ausführen, wird gegen SQL02 ausgeführt. Ich habe dieses Problem im Laufe der Jahre einige Male und nach langem Hin und Her und "Warum nicht es funktioniert?" erkannte meinen Fehler. Im Editor sehen Sie in der unteren rechten Ecke, mit welcher Instanz und Datenbank Sie verbunden sind.

SM
quelle
1

TL; DR: Möglicherweise haben Sie eine gespeicherte Prozedur, die eine andere gespeicherte Prozedur aufruft, die nicht vorhanden ist.


Ich hatte dieses Problem und fand eine Lösung. Folgendes ist passiert. Ich habe eine gespeicherte Prozedur erstellt:

create procedure dbo.MyProc
    ...

Ich habe dann eine andere gespeicherte Prozedur erstellt, die die erste ausgeführt hat

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

Einige Zeit später, ich umbenannt dbo.MyProczu dbo.MyProc2. Nach dem Umbenennen, als ich versucht habe anzurufen dbo.MyProcCaller, erhalte ich folgende Fehlermeldung:

exec dbo.MyProcCaller

Die gespeicherte Prozedur 'RLM.usp_getSecondaryRestrictedLists_Old' konnte nicht gefunden werden.

Meine Lösung bestand darin, meine zweite gespeicherte Prozedur so zu ändern, dass sie den neuen Namen verwendet:

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

Hier ist eine einfache Möglichkeit, um zu überprüfen, ob Sie dieses Problem haben. Klicken Sie auf, um den Text der gespeicherten Prozedur zu ändern und diesen Text dann auszuführen. Wenn Sie eine Warnung wie diese erhalten, müssen Sie Ihre gespeicherte Prozedur umbenennen:

Das Modul 'dbo.MyProcCaller' hängt vom fehlenden Objekt 'dbo.MyProc' ab. Das Modul wird weiterhin erstellt. Es kann jedoch nicht erfolgreich ausgeführt werden, bis das Objekt vorhanden ist.

(1 Zeile (n) betroffen)

user2023861
quelle
0

Diese Frage ist ein paar Jahre alt, aber ich möchte nur eine andere Möglichkeit für jemanden wie mich einbringen, der sie später gefunden hat.

Ich habe folgenden Befehl ausgeführt: EXEC SP_CONFIGURE 'Agent XPs'

Und der Fehler wurde beschrieben: Meldung 2812, Ebene 16, Status 62, Zeile 1 Die gespeicherte Prozedur 'SP_CONFIGURE' konnte nicht gefunden werden.

Aber dann erinnerte ich mich, dass dieser Server so eingerichtet ist, dass Groß- und Kleinschreibung beachtet wird. Dieser Befehl hat also einwandfrei funktioniert: EXEC sp_configure 'Agent XPs'

HTH

jrdevdba
quelle