"No se pudo encontrar el procedimiento almacenado 'aunque el procedimiento almacenado se haya creado en MS SQL Server Management Studio

21

He creado una tabla testtabledentro de la base de datos testbaseque tiene la siguiente estructura:

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

que utilicé el Microsoft SQL Server 2008 Management Studio.

Creé un procedimiento almacenado de la testtable_pricesmallersiguiente manera

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

y pueden ver los Procedimientos almacenados en Object Explorerel Microsoft SQL Server Management Studio. (Se enumera en la siguiente estructura de árbol de la Object Explorer)

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

Me resulta muy extraño cuando recibo el siguiente error:

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

cuando ejecuto la siguiente instrucción SQL:

execute dbo.testtable_pricesmaller 50

¿Qué podría faltar?

Jack
fuente
¿Se aseguró de que su instrucción de ejecución se ejecute en el contexto de la base de datos "testbase"? Puede intentar agregar una instrucción USE o calificar completamente el nombre del objeto.
Shawn Melton
Sí, agregué la USEdeclaración pero me dio el error.
Jack
Tuve que definir explícitamente el nombre de la base de datos en mi declaración de ejecución: EXEC [testbase]. [Dbo]. [Testtable_pricesmaller] 50
Jroonk

Respuestas:

17

IntelliSense Refresh local Cache debería solucionarlo

usuario63684
fuente
7

No debería tener que reiniciar la base de datos después de agregar un nuevo procedimiento almacenado, aunque deberá actualizar su explorador de objetos para verlo allí.

La próxima vez que agregue un procedimiento almacenado, intente ejecutar la opción de ejecución con el botón derecho del explorador de objetos e ingrese sus parámetros y vea si se ejecuta. Si no se ejecuta, no estoy seguro de cuál es su problema. Si se ejecuta, podría ser algo simple, como SQL está intentando consultar desde la base de datos incorrecta.

Zane
fuente
4

Por fin sé por qué aparece el mensaje en MS SQL Server Management Studio.

MS SQL Server Management Studio requiere uno para reiniciarlo después de crear un procedimiento almacenado en él.

Después de reiniciar MS SQL Server Management Studio, ya no existe ese error.

(Extraño, ¿eso significa que cada vez que creo un procedimiento almacenado, tengo que reiniciarlo?)

Jack
fuente
12
No debería tener que reiniciarlo.
Shawn Melton
1
@ShawnMelton Quiero decir que cierro el MS SQL Server Management Studio y vuelvo a abrir el MS SQL Server Management Studio. Me parece bastante extraño que tenga que cerrar y luego volver a abrirlo. ¿Hay alguna configuración de MS SQL Server Management Studio (SSMS) que me pueda faltar, lo que hace que el SSMS no pueda reflejar que el Procedimiento almacenado ya está creado?
Jack
55
IntelliSense es la única parte rezagada de lo que hizo. La ejecución de la declaración ejecutiva debería haber funcionado sin reiniciar SSMS. Hay algo más que contribuyó a que no funcionara. Estoy de acuerdo con @ShawnMelton.
Thomas Stringer
@ Tiburón, ¡Interesante! Agradecería si alguien me puede explicar por qué mi SSMS se comporta de tal manera que me resulta bastante extraño.
Jack
66
Para referencia futura: Ctrl-Shift-R actualizará el caché local, para intellisense.
Adam Scharp
3

Su comando de creación debería ser

create procedure dbo.testtable_pricesmaller
    @pricelimit money

falta dbo.antes del nombre del procedimiento. Siempre que cree un procedimiento, es una buena práctica definir explícitamente el usuario / esquema con el nombre de un procedimiento, es decir, el nombre del procedimiento debe tener firmas totalmente calificadas.

Espero que esto ayude.

Saim Saboor
fuente
3

En SQL Server 2008, cuando inicia sesión con una cuenta de Windows, si no tiene el nivel de seguridad SYSADMIN, cuando crea un objeto sin especificar explícitamente el esquema, puede / lo creará en [DOMINIO \ nombre de usuario]. [ObjectName ] en lugar de [dbo]. [ObjectName] (creo que se solucionó en SQL Server 2012).

Me ocurrió este problema cuando reduje el nivel de seguridad de un usuario, y uno de los procedimientos que estaba ejecutando era soltar y recrear tablas sin un esquema, por lo que el resto del procedimiento se bloqueaba porque no podía acceder al objeto nuevamente . Resulta que las tablas ahora se crearon con su nombre de usuario de dominio.

Aquí está la publicación de Microsoft sobre este comportamiento:

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017 (busque la sección "Esquema implícito y creación de usuarios")

La tabla no se crea bajo el esquema dbo

SQL 2008 R2 crea un usuario / esquema cuando el usuario de Windows crea tablas

Entonces, en resumen, es probable que tenga un problema en la base de datos (crea su tabla en una base de datos pero intenta acceder desde otra) o tiene el problema como acabo de describir.

Philippe
fuente
2

Sé que esto es viejo; Encontré esta pregunta mientras buscaba una solución para este mismo problema, y ​​estoy publicando esta respuesta con la esperanza de que ayude a otros que también encuentran esta pregunta.

En mi caso, recibí el mensaje de error al ejecutar un informe SSRS utilizando una fuente de datos compartida. Esta fuente de datos compartida no especificó una base de datos predeterminada (el Catálogo predeterminado = parámetro), y no pude agregarla a la cadena de conexión porque no tengo la contraseña (y cuando cambia algo en una fuente de datos SSRS tiende a querer que vuelva a ingresar la contraseña).

Para resolver esto, cambié la base de datos predeterminada para el inicio de sesión en la instancia de SQL Server de maestro a la base de datos que contiene el procedimiento almacenado que el informe quería ejecutar.

Al ejecutar cosas desde SSMS, tenga en cuenta que el panel del Explorador de objetos es una conexión, mientras que el editor que tenga es una conexión completamente diferente. Por lo tanto, es posible que vea los objetos para SQL01 en el Explorador de objetos, pero el código que está ejecutando en un editor se ejecutará contra SQL02: me he encontrado con este problema varias veces a lo largo de los años y después de muchas insultos y "¿Por qué no? ¿funciona?" Me di cuenta de mi error. Para el editor, busque en la esquina inferior derecha para ver a qué instancia y base de datos está conectado.

SM
fuente
1

TL; DR: es posible que tenga un procedimiento almacenado que está llamando a otro procedimiento almacenado que no existe.


Tuve este problema y encontré una solución. Esto es lo que pasó. Creé un procedimiento almacenado:

create procedure dbo.MyProc
    ...

Luego creé otro procedimiento almacenado que ejecutó el primero

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

Algún tiempo después, cambié el nombre dbo.MyProca dbo.MyProc2. Después de cambiarle el nombre, cuando intenté llamar dbo.MyProcCaller, recibí este mensaje de error:

exec dbo.MyProcCaller

No se pudo encontrar el procedimiento almacenado 'RLM.usp_getSecondaryRestrictedLists_Old'.

Mi solución fue alterar mi segundo procedimiento almacenado para usar el nuevo nombre:

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

Aquí hay una manera simple de verificar si tiene este problema. Haga clic para modificar el texto del procedimiento almacenado y luego ejecute ese texto. Si recibe una advertencia como esta, debe cambiar el nombre de su procedimiento almacenado:

El módulo 'dbo.MyProcCaller' depende del objeto faltante 'dbo.MyProc'. El módulo aún se creará; sin embargo, no puede ejecutarse correctamente hasta que exista el objeto.

(1 fila (s) afectada)

usuario2023861
fuente
0

Esta pregunta tiene algunos años, pero solo quiero agregar otra posibilidad para cualquiera como yo que la haya encontrado más tarde.

Ejecuté este comando: EXEC SP_CONFIGURE 'Agent XPs'

Y se describe el error: Msg 2812, Nivel 16, Estado 62, Línea 1 No se pudo encontrar el procedimiento almacenado 'SP_CONFIGURE'.

Pero luego recordé que este servidor está configurado para distinguir entre mayúsculas y minúsculas. Entonces este comando funcionó bien: EXEC sp_configure 'Agent XPs'

HTH

jrdevdba
fuente