"Impossibile trovare la stored procedure" anche se la stored procedure è stata creata in MS SQL Server Management Studio


21

Ho creato una tabella testtableall'interno del database testbaseche ha la seguente struttura:

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

che ho usato Microsoft SQL Server 2008 Management Studio.

Ho creato una procedura memorizzata testtable_pricesmallercome segue

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

e sono in grado di visualizzare le Stored procedure su Object ExplorerMicrosoft SQL Server Management Studio. (È elencato nella seguente struttura ad albero del Object Explorer)

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

Lo trovo molto strano quando ricevo il seguente errore:

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

quando eseguo la seguente istruzione SQL:

execute dbo.testtable_pricesmaller 50

Cosa potrebbe mancare?


Ti sei assicurato che l'istruzione execute sia in esecuzione nel contesto del database "testbase"? Potresti provare ad aggiungere un'istruzione USE o qualificare completamente il nome dell'oggetto.
Shawn Melton,

Sì, ho aggiunto la USEdichiarazione ma mi dà l'errore.
Jack,

Ho dovuto definire esplicitamente il nome del database nella mia dichiarazione di esecuzione: EXEC [testbase]. [Dbo]. [Testtable_pricesmaller] 50
Jroonk,

Risposte:



7

Non è necessario riavviare il database dopo aver aggiunto una nuova procedura memorizzata, anche se sarà necessario aggiornare Esplora oggetti per vederlo lì.

La prossima volta che aggiungi una procedura memorizzata, prova a eseguire l'opzione di esecuzione del clic destro da Esplora oggetti e inserisci i tuoi parametri e vedi se è in esecuzione. Se non funziona, non sono sicuro di quale sia il tuo problema. Se viene eseguito, potrebbe essere qualcosa di semplice come SQL sta cercando di eseguire una query dal database errato.


4

Finalmente so perché il messaggio appare in MS SQL Server Management Studio.

MS SQL Server Management Studio ne richiede uno per riavviarlo dopo aver creato una procedura memorizzata in esso.

Dopo aver riavviato MS SQL Server Management Studio, non si verifica più tale errore.

(Strano, significa che ogni volta che creo una procedura memorizzata, devo riavviarla?)


12
Non dovresti doverlo riavviare.
Shawn Melton,

1
@ShawnMelton Voglio dire che chiudo MS SQL Server Management Studio e riapro MS SQL Server Management Studio. Trovo abbastanza strano che devo chiudere e poi riaprirlo. È possibile che manchi qualche configurazione di MS SQL Server Management Studio (SSMS), che non è in grado di riflettere che la procedura memorizzata è già stata creata?
Jack,

5
IntelliSense è l'unica parte in ritardo di ciò che hai fatto. L'esecuzione dell'istruzione exec avrebbe dovuto funzionare senza riavviare SSMS. C'è qualcos'altro che ha contribuito a non funzionare. Sono d'accordo con @ShawnMelton.
Thomas Stringer,

@Shark, interessante! Gradirei se qualcuno potesse spiegarmi perché il mio SSMS si comporta in modo tale da trovarlo abbastanza strano.
Jack,

6
Per riferimento futuro: Ctrl-Shift-R aggiornerà la cache locale, per intellisense.
Adam Scharp,

3

Il tuo comando create dovrebbe essere

create procedure dbo.testtable_pricesmaller
    @pricelimit money

ti manca dbo.prima del nome della procedura. Ogni volta che si crea una procedura, è buona norma definire esplicitamente l'utente / schema con il nome di una procedura, ovvero il nome della procedura deve avere firme complete.

Spero che questo ti possa aiutare.


3

In SQL Server 2008, quando si accede con un account Windows, se non si dispone del livello di sicurezza SYSADMIN, quando si crea un oggetto senza specificare esplicitamente lo schema, è possibile / lo creerà sotto il [DOMINIO \ nomeutente]. [Nome oggetto ] invece di [dbo]. [ObjectName] (credo sia stato risolto in SQL Server 2012).

Ho avuto questo problema a me accaduto quando ho ridotto il livello di sicurezza di un utente e una delle procedure che stava eseguendo consisteva nel far cadere e ricreare le tabelle senza uno schema, quindi il resto della procedura stava andando in crash perché non poteva accedere nuovamente all'oggetto . Si scopre che le tabelle sono state ora create con il suo nome utente di dominio.

Ecco il post di Microsoft su questo comportamento:

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017 (cercare la sezione "Schema implicito e creazione dell'utente")

La tabella non viene creata nello schema dbo

SQL 2008 R2 crea utente / schema quando l'utente Windows crea tabelle

Quindi, in breve, probabilmente hai un problema con il database (crei la tua tabella in un database ma provi ad accedervi da un altro) o hai il problema come ho appena descritto.


2

So che questo è vecchio; Mi sono imbattuto in questa domanda mentre cercavo una soluzione a questo stesso problema, e sto postando questa risposta nella speranza che aiuti anche gli altri a trovare questa domanda.

Nel mio caso, ho ricevuto il messaggio di errore durante l'esecuzione di un report SSRS utilizzando un'origine dati condivisa. Questa origine dati condivisa non ha specificato un database predefinito (il Catalogo predefinito = parametro) e non sono riuscito ad aggiungerlo alla stringa di connessione perché non ho la password (e quando si cambia qualcosa in un'origine dati SSRS tende per reinserire la password).

Per risolvere questo problema, ho modificato il database predefinito per l'accesso nell'istanza di SQL Server dal master al database contenente la procedura memorizzata che il rapporto voleva eseguire.

Quando esegui cose da SSMS, tieni presente che il riquadro Esplora oggetti è una connessione mentre qualsiasi editor che hai è una connessione completamente diversa. Quindi potresti vedere gli oggetti per SQL01 in Esplora oggetti, ma il codice che stai eseguendo in un editor verrà eseguito su SQL02: ho riscontrato questo problema alcune volte nel corso degli anni e dopo molte imprecazioni e "Perché non lo farò funziona?" realizzato il mio errore. Per l'editor, guarda nell'angolo in basso a destra per vedere a quale istanza e database sei connesso.


1

TL; DR: potresti avere una stored procedure che chiama un'altra stored procedure che non esiste.


Ho avuto questo problema e ho trovato una soluzione. Ecco cosa è successo. Ho creato una procedura memorizzata:

create procedure dbo.MyProc
    ...

Ho quindi creato un'altra procedura memorizzata che ha eseguito la prima

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

Qualche tempo dopo, ho rinominato dbo.MyProca dbo.MyProc2. Dopo averlo rinominato, quando ho provato a chiamare dbo.MyProcCaller, ho ricevuto questo messaggio di errore:

exec dbo.MyProcCaller

Impossibile trovare la procedura memorizzata 'RLM.usp_getSecondaryRestrictedLists_Old'.

La mia soluzione era quella di modificare la mia seconda procedura memorizzata per utilizzare il nuovo nome:

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

Ecco un modo semplice per verificare se hai questo problema. Fare clic per modificare il testo della procedura memorizzata e quindi eseguire quel testo. Se ricevi un avviso come questo, devi rinominare la procedura memorizzata:

Il modulo 'dbo.MyProcCaller' dipende dall'oggetto mancante 'dbo.MyProc'. Il modulo verrà comunque creato; tuttavia, non può essere eseguito correttamente fino a quando l'oggetto non esiste.

(1 riga (e) interessate


0

Questa domanda ha qualche anno, ma voglio solo dare un'altra possibilità per chiunque come me che l'abbia trovata in seguito.

Ho eseguito questo comando: EXEC SP_CONFIGURE 'Agent XPs'

E ottenuto l'errore descritto: Messaggio 2812, livello 16, stato 62, riga 1 Impossibile trovare la procedura memorizzata "SP_CONFIGURE".

Ma poi mi sono ricordato che questo server è impostato per la distinzione tra maiuscole e minuscole. Quindi questo comando ha funzionato bene: EXEC sp_configure 'Agent XPs'

HTH

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.